共用方式為


屬性函式

在 .NET Framework 版本、和 4.5,屬性函式可用來評估 MSBuild 指令碼。只要屬性出現時,就可以使用屬性函式。不像工作,屬性函式可用於目標外部,而且會在任何目標執行之前進行評估。

不需要使用 MSBuild 工作,您就可以在建置指令碼內讀取系統時間、比較字串、比對規則運算式以及執行其他動作。MSBuild 會嘗試將字串轉換為數字,將數字轉換為字串,並且進行其他必要的轉換作業。

本主題內容:

  • 屬性函式語法

    • 字串屬性函式

    • 靜態屬性函式

    • 在靜態屬性上呼叫執行個體方法

    • MSBuild 屬性函式

  • 巢狀屬性函式

  • MSBuild DoesTaskHostExist

  • MSBuild GetDirectoryNameOfFileAbove

  • MSBuild GetRegistryValue

  • MSBuild GetRegistryValueFromView

  • MSBuild MakeRelative

  • MSBuild ValueOrDefault

屬性函式語法

下列是三種屬性函式,每個函式具有不同的語法:

  • 字串 (執行個體) 屬性函式

  • 靜態屬性函式

  • MSBuild 屬性函式

Dd633440.collapse_all(zh-tw,VS.110).gif字串屬性函式

所有建置屬性值都只是字串值。您可以使用字串 (執行個體) 方法來操作任何屬性值。例如,您可以使用下列程式碼,從代表完整路徑的建置屬性擷取磁碟機名稱 (前三個字元):

$(ProjectOutputFolder.Substring(0,3))

Dd633440.collapse_all(zh-tw,VS.110).gif靜態屬性函式

在您的組建指令碼中,您可以存取許多系統類別的靜態屬性和方法。若要取得靜態屬性的值,請使用下列語法,其中 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

Dd633440.collapse_all(zh-tw,VS.110).gif在靜態屬性上呼叫執行個體方法

如果您存取的靜態屬性會傳回物件執行個體,您可以叫用該物件的執行個體方法。若要叫用執行個體方法,請使用下列語法,其中 Class 是系統類別名稱、Property 是屬性名稱、Method 是方法名稱,而 (Parameters) 是方法的參數清單:

$([Class]:: Property.Method(Parameters))

類別名稱必須是具有命名空間的完整名稱。

例如,您可以使用下列程式碼將建置屬性設定為目前的日期。

<Today>$([System.DateTime]::Now.ToString("yyyy.MM.dd"))</Today>

Dd633440.collapse_all(zh-tw,VS.110).gifMSBuild 屬性函式

您的組建中有數個靜態方法可供存取,以提供算術、位元邏輯和逸出字元支援。您可以使用下列語法來存取這些方法,其中 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
-->

請參閱

概念

MSBuild 屬性

其他資源

MSBuild