共用方式為


屬性函式

在 .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 批次處理

請參閱

概念

MSBuild 屬性

其他資源

MSBuild