Why is% (Identity) expanding to an empty string?

I was told that the following should create an ItemGroup of metadata files saying whether they are read-only or not:

<?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> 

However, I get the following output (when launched from the Developer Visual Studio 2013 command prompt):

 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:\> 

Should this work? If so, where am I going wrong?

+2
source share
1 answer

It looks like you cannot reference Item metadata when creating an ItemGroup from the target.

Change script to:

 <?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> 

The following output will be made:

 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> 

You can change your script to this if all of your elements are guaranteed to exist before the script runs. However, I suspect, since you are using it for a purpose that they do not use. In this case, you may need to complete the CreateItem task.

+2
source

Source: https://habr.com/ru/post/1303929/


All Articles