屬性函式
在 .NET Framework 4 版中,屬性函式可以用於評估 MSBuild 指令碼。 只要屬性出現時,就可以使用屬性函式。 不像工作,屬性函式可用於目標外部,而且會在任何目標執行之前進行評估。
不需要使用 MSBuild 工作,您就可以在建置指令碼內讀取系統時間、比較字串、比對規則運算式以及執行其他動作。 MSBuild 會嘗試將字串轉換為數字,將數字轉換為字串,並且進行其他必要的轉換作業。
屬性函式語法
下列是三種屬性函式,每個函式具有不同的語法:
字串 (執行個體) 屬性函式
靜態屬性函式
MSBuild 屬性函式
字串屬性函式
所有建置屬性值都只是字串值。 您可以使用字串 (執行個體) 方法來操作任何屬性值。 例如,您可以使用下列程式碼,從代表完整路徑的建置屬性擷取磁碟機名稱 (前三個字元):
$(ProjectOutputFolder.Substring(0,3))
靜態屬性函式
在您的組建指令碼中,您可以存取許多系統類別的靜態屬性和方法。 若要取得靜態屬性的值,請使用下列語法,其中 Class 是系統類別名稱,而 Property 是屬性名稱。
$([Class]::Property)
例如,您可以使用下列程式碼將建置屬性設定為目前的日期和時間。
<Today>$([System.DateTime]::Now)</Today>
若要呼叫靜態方法,請使用下列語法,其中 Class 是系統類別名稱、Method 是方法名稱,而 (Parameters) 是方法的參數清單:
$([Class]::Member(Parameters))
例如,若要將建置屬性設為新的 GUID,您可以使用下列指令碼:
<NewGuid>$([System.Guid]::NewGuid())</NewGuid>
在靜態屬性函式中,您可以使用這些系統類別的任何靜態方法或屬性:
System.Byte
System.Char
System.Convert
System.DateTime
System.Decimal
System.Double
System.Enum
System.Guid
System.Int16
System.Int32
System.Int64
System.IO.Path
System.Math
System.UInt16
System.UInt32
System.UInt64
System.SByte
System.Single
System.String
System.StringComparer
System.TimeSpan
System.Text.RegularExpressions.Regex
Microsoft.Build.Utilities.ToolLocationHelper
此外,還可以使用下列靜態方法和屬性:
System.Environment::CommandLine
System.Environment::ExpandEnvironmentVariables
System.Environment::GetEnvironmentVariable
System.Environment::GetEnvironmentVariables
System.Environment::GetFolderPath
System.Environment::GetLogicalDrives
System.IO.Directory::GetDirectories
System.IO.Directory::GetFiles
System.IO.Directory::GetLastAccessTime
System.IO.Directory::GetLastWriteTime
System.IO.Directory::GetParent
System.IO.File::Exists
System.IO.File::GetCreationTime
System.IO.File::GetAttributes
System.IO.File::GetLastAccessTime
System.IO.File::GetLastWriteTime
System.IO.File::ReadAllText
在靜態屬性上呼叫執行個體方法
如果您存取的靜態屬性會傳回物件執行個體,您可以叫用該物件的執行個體方法。 若要叫用執行個體方法,請使用下列語法,其中 Class 是系統類別名稱、Property 是屬性名稱、Method 是方法名稱,而 (Parameters) 是方法的參數清單:
$([Class]:: Property.Method(Parameters))
類別名稱必須是具有命名空間的完整名稱。
例如,您可以使用下列程式碼將建置屬性設定為目前的日期。
<Today>$([System.DateTime]::Now.ToString("yyyy.MM.dd"))</Today>
MSBuild 屬性函式
您的組建中有數個靜態方法可供存取,以提供算術、位元邏輯和逸出字元支援。 您可以使用下列語法來存取這些方法,其中 Method 是方法名稱,而 Parameters 是方法的參數清單。
$([MSBuild]::Method(Parameters))
例如,若要一起加入兩個具有數值的屬性,請使用下列程式碼。
$([MSBuild]::Add($(NumberOne), $(NumberTwo))
以下是 MSBuild 屬性函式的清單:
函式簽章 |
說明 |
---|---|
double Add(double a, double b) |
加上兩個 double。 |
long Add(long a, long b) |
加上兩個 long。 |
double Subtract(double a, double b) |
減去兩個 double。 |
long Subtract(long a, long b) |
減去兩個 long。 |
double Multiply(double a, double b) |
乘以兩個 double。 |
long Multiply(long a, long b) |
乘以兩個 long。 |
double Divide(double a, double b) |
除以兩個 double。 |
long Divide(long a, long b) |
除以兩個 long。 |
double Modulo(double a, double b) |
取兩個 double 的餘數。 |
long Modulo(long a, long b) |
取兩個 long 的餘數。 |
string Escape(string unescaped) |
依據 MSBuild 逸出規則來逸出字串。 |
string Unescape(string escaped) |
依據 MSBuild 逸出規則來取消逸出字串。 |
int BitwiseOr(int first, int second) |
在第一個和第二個 (first | second) 上執行位元 OR。 |
int BitwiseAnd(int first, int second) |
在第一個和第二個 (first & second) 上執行位元 AND。 |
int BitwiseXor(int first, int second) |
在第一個和第二個 (first ^ second) 上執行位元 XOR。 |
int BitwiseNot(int first) |
執行位元 NOT (~first)。 |
MSBuild GetRegistryValueFromView
若指定登錄機碼、值和一個或多個排序登錄檢視,MSBuild GetRegistryValueFromView 屬性函式可取得系統登錄資料, 方法是在每個登錄檢視中依順序搜尋機碼和值,直到找到為止。
此屬性函式的語法為:
[MSBuild]::GetRegistryValueFromView(string keyName, string valueName, object defaultValue, params object[] views)
Windows 64 位元作業系統會維護 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node 這個登錄機碼,其代表 32 位元應用程式的 HKEY_LOCAL_MACHINE\SOFTWARE 登錄檢視。
根據預設,在 WOW64 上執行的 32 位元應用程式會存取 32 位元登錄檢視,而 64 位元應用程式則會存取 64 位元登錄檢視。
以下為可用的登錄檢視:
登錄檢視 |
定義 |
---|---|
RegistryView.Registry32 |
32 位元應用程式登錄檢視。 |
RegistryView.Registry64 |
64 位元應用程式登錄檢視。 |
RegistryView.Default |
符合應用程式所執行之處理序的登錄檢視。 |
例如:
$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Silverlight\v3.0\ReferenceAssemblies', 'SLRuntimeInstallPath', null, RegistryView.Registry64, RegistryView.Registry32))
會先搜尋 64 位元登錄檢視,接著再搜尋 32 位元登錄檢視,以取得 ReferenceAssemblies 機碼的 SLRuntimeInstallPath 資料。
MSBuild GetRegistryValue
MSBuild GetRegistryValue 屬性函式會傳回登錄機碼的值。 此函式會採用兩個引數,也就是索引鍵名稱和值名稱。 它會從登錄傳回值。 如果您未指定值名稱,則會傳回預設值。
下列範例將說明如何使用此函式:
$([MSBuild]::GetRegistryValue(`HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\Debugger`, ``)) // default value
$([MSBuild]::GetRegistryValue(`HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\Debugger`, `SymbolCacheDir`))
$([MSBuild]::GetRegistryValue(`HKEY_LOCAL_MACHINE\SOFTWARE\(SampleName)`, `(SampleValue)`)) // parens in name and value
MSBuild GetDirectoryNameOfFileAbove
MSBuild GetDirectoryNameOfFileAbove 屬性函式會在目錄中尋找與路徑中目前目錄相關的檔案。
此屬性函式的語法為:
$[MSBuild]::GetDirectoryNameOfFileAbove(string ThePath, string TheFile)
例如:
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))\EnlistmentInfo.props" Condition=" '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))' != '' " />
巢狀屬性函式
屬性函式可以合併起來,形成更複雜的函式。 例如:
$([MSBuild]::BitwiseAnd(32, $([System.IO.File]::GetAttributes(tempFile))))
會傳回 tempFile 路徑所提供之檔案的 FileAttributes Archive 位元值 (32 或 0)。 請注意,列舉資料值不能以屬性函式內的名稱顯示。 必須改用數值 (32)。
中繼資料也可能出現在巢狀屬性函式中。 如需詳細資訊,請參閱MSBuild 批次處理。