屬性函式
在 .NET Framework 版本、和 4.5,屬性函式可用來評估 MSBuild 指令碼。只要屬性出現時,就可以使用屬性函式。不像工作,屬性函式可用於目標外部,而且會在任何目標執行之前進行評估。
不需要使用 MSBuild 工作,您就可以在建置指令碼內讀取系統時間、比較字串、比對規則運算式以及執行其他動作。MSBuild 會嘗試將字串轉換為數字,將數字轉換為字串,並且進行其他必要的轉換作業。
本主題內容:
屬性函式語法
字串屬性函式
靜態屬性函式
在靜態屬性上呼叫執行個體方法
MSBuild 屬性函式
巢狀屬性函式
MSBuild DoesTaskHostExist
MSBuild GetDirectoryNameOfFileAbove
MSBuild GetRegistryValue
MSBuild GetRegistryValueFromView
MSBuild MakeRelative
MSBuild ValueOrDefault
屬性函式語法
下列是三種屬性函式,每個函式具有不同的語法:
字串 (執行個體) 屬性函式
靜態屬性函式
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]::BitwiseAnd(32, $([System.IO.File]::GetAttributes(tempFile))))
這個範例會傳回 FileAttributesArchive 位元的值 (以或為路徑給之檔案 tempFile。請注意,列舉資料值不能以屬性函式內的名稱顯示。必須改用數值 (32)。
中繼資料也可能出現在巢狀屬性函式中。如需詳細資訊,請參閱MSBuild 批次處理。
MSBuild DoesTaskHostExist
在的 DoesTaskHostExist MSBuild 屬性函式傳回工作主機是否為指定的執行階段和架構值目前安裝。
這個屬性函式的語法如下:
$[MSBuild]::DoesTaskHostExist(string theRuntime, string theArchitecture)
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 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 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 MakeRelative
MakeRelative MSBuild 屬性函式傳回第二個路徑的相對路徑相對於第一個路徑。每個路徑可以是檔案或資料夾。
這個屬性函式的語法如下:
$[MSBuild]::MakeRelative($(FileOrFolderPath1), $(FileOrFolderPath2))
下列程式碼是這個語法的範例。
<PropertyGroup>
<Path1>c:\users\</Path1>
<Path2>c:\users\username\</Path2>
</PropertyGroup>
<Target Name = "Go">
<Message Text ="$([MSBuild]::MakeRelative($(Path1), $(Path2)))" />
<Message Text ="$([MSBuild]::MakeRelative($(Path2), $(Path1)))" />
</Target>
<!--
Output:
username\
..\
-->
MSBuild ValueOrDefault
除非它是 null 或空白, ValueOrDefault MSBuild 屬性函式會傳回第一個引數。如果第一個引數為 null 或空白,則函式會傳回第二個引數。
下列範例顯示如何使用這個函式。
<Project ToolsVersion="4.0" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Value1>$([MSBuild]::ValueOrDefault(`$(UndefinedValue)`, `a`))</Value1>
<Value2>$([MSBuild]::ValueOrDefault(`b`, `$(Value1)`))</Value2>
</PropertyGroup>
<Target Name="MyTarget">
<Message Text="Value1 = $(Value1)" />
<Message Text="Value2 = $(Value2)" />
</Target>
</Project>
<!--
Output:
Value1 = a
Value2 = b
-->