2014-10-30 85 views
2

我已經告訴下面應該創建元數據說他們是否只與否讀取文件的的ItemGroup:爲什麼%(Identity)擴展爲空字符串?

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     DefaultTargets="Run" 
     ToolsVersion="12.0"> 

<Target Name="Main"> 
    <ItemGroup> 
     <MyFiles Include="test.proj"> <!-- also tried with *.*. Using test.proj (this file) to be sure it is a file that exists --> 
      <ReadOnly Condition='1 == $([MSBuild]::BitwiseAnd(1, $([System.IO.File]::GetAttributes("%(Identity)"))))'>True</ReadOnly> 
     </MyFiles> 
    </ItemGroup> 

</Target> 

<Target Name="Run" Outputs="%(MyFiles.Identity)" DependsOnTargets="Main"> 
    <Message Text="%(MyFiles.Identity) Not ReadOnly" Condition="%(MyFiles.ReadOnly) != True"/> 
    <Message Text="%(MyFiles.Identity) ReadOnly" Condition="%(MyFiles.ReadOnly) == True" /> 
</Target> 

</Project> 

但是,我得到下面的輸出(從開發者的命令提示符下運行時對於Visual Studio 2013):

S:\>msbuild test.proj 
Microsoft (R) Build Engine version 12.0.30723.0 
[Microsoft .NET Framework, version 4.0.30319.34014] 
Copyright (C) Microsoft Corporation. All rights reserved. 

Build started 30/10/2014 21:18:46. 
Project "S:\test.proj" on node 1 (default targets). 
S:\test.proj(9,13): error MSB4184: The expression "[System.IO.File]::GetAttributes('')" cannot be evaluated. The path is not of a legal form. 
Done Building Project "S:\test.proj" (default targets) -- FAILED. 


Build FAILED. 

"S:\test.proj" (default target) (1) -> 
(Main target) -> 
    S:\test.proj(9,13): error MSB4184: The expression "[System.IO.File]::GetAttributes('')" cannot be evaluated. The path is not of a legal form. 

    0 Warning(s) 
    1 Error(s) 

Time Elapsed 00:00:00.01 

S:\> 

應該這樣工作嗎?如果是這樣,我哪裏錯了?

回答

2

從目標中創建ItemGroup時,看起來您無法引用Item Metadata。

更改你的腳本:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     DefaultTargets="Run" 
     ToolsVersion="12.0"> 

<ItemGroup> 
    <MyFiles Include="test.proj" > 
     <ReadOnly Condition='1 == $([MSBuild]::BitwiseAnd(1, $([System.IO.File]::GetAttributes("%(Identity)"))))'>True</ReadOnly> 
    </MyFiles> 
</ItemGroup> 

<Target Name="Run" Outputs="%(MyFiles.Identity)"> 
    <Message Text="%(MyFiles.Identity) Not ReadOnly" Condition="%(MyFiles.ReadOnly) != True"/> 
    <Message Text="%(MyFiles.Identity) ReadOnly" Condition="%(MyFiles.ReadOnly) == True" /> 
</Target> 

</Project> 

將產生以下的輸出:

D:\temp\test>"C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe" test1.msbuild /t:run 
Microsoft (R) Build Engine version 12.0.30723.0 
[Microsoft .NET Framework, version 4.0.30319.18444] 
Copyright (C) Microsoft Corporation. All rights reserved. 

Build started 10/30/2014 4:31:35 PM. 
Project "D:\temp\test\test1.msbuild" on node 1 (run target(s)). 
Run: 
    test.proj Not ReadOnly 
Done Building Project "D:\temp\test\test1.msbuild" (run target(s)). 


Build succeeded. 
    0 Warning(s) 
    0 Error(s) 

Time Elapsed 00:00:00.17 

D:\temp\test> 

你可以改變你的腳本這一點,如果所有項目都保證在腳本運行之前存在。但是,我懷疑你是從一個他們沒有的目標中使用它。在這種情況下,您可能需要使用CreateItem任務。

相關問題