MSBuild中@和$和%之间有什么区别?

时间:2011-06-22 20:18:03

标签: .net msbuild

在MSBuild中引用变量时有什么区别。例如,下面有一个@$以及一个%

<Copy SourceFiles="@(Files)" DestinationFolder="$(TempBuildDir)\%(RecursiveDir)">
   <Output TaskParameter="CopiedFiles" ItemName="DeployFiles" />
</Copy>

2 个答案:

答案 0 :(得分:15)

$表示对属性的访问(某种包含简单值的变量)

@是for item,通常是一组名为

的附加元数据的文件

%表示访问项目的元数据。自动附加到项目的wellknown metadatas(如RecursiveDir,请参阅msdn中的定义),或者您可以在定义项目时附加自己的元数据

假设你定义这样的@(文件):

<ItemGroup>
   <Files include='c:\source\**\*.*'>  <!-- all files in all subfolder in c:\source -->
     <Color>Blue</Color> <!-- attach metadata color = 'Blue' to these files -->
   </Files>
   <Files include='c:\source2\**\*.*'>  <!-- all files in all subfolder in c:\source2 -->
     <Color>Red</Color> <!-- attach metadata color = 'Red' to these files -->
   </Files>
</ItemGroup>

如果c:\ source包含文件1.txt,b / 2.dll,c / 3.xml和c:\ source2包含/ 4.exe,@(Files)就像这样形成

  • 文件c:\ source \ 1.txt,带有元数据 color ='Blue'和RecursiveDir =''

  • 文件c:\ source \ b \ 2.dll,包含元数据 color ='Blue'和RecursiveDir ='b'

  • 文件c:\ source \ c \ 3.xml,包含元数据 color ='Blue'和RecursiveDir ='c'

  • 文件c:\ source2 \ a \ 4.exe,带 元数据颜色='红色'和 RecursiveDir ='a'

如果你像这样定义TempBuildDir

<PropertyGroup>
 <TempBuildDir>c:\temp<TempBuildDir>
</PropertyGroup>

您有某种包含简单值的变量:c:\ temp

您的示例如下所示:将项目File中定义的每个文件复制到一个目录中,该目录是通过将变量TempBuildDir的值与您找到该文件的Recursive目录相连接而形成的。

你最终得到:

  • C:\ TEMP \ 1.txt的

  • C:\ TEMP \ B \ 2.DLL

  • C:\临时工\ C \ 3.XML

  • C:\ TEMP \一个\ 4.exe

答案 1 :(得分:5)

以下是特殊字符的完整列表:

http://msdn.microsoft.com/en-us/library/bb383819.aspx