Msbuild 为什么%(Identity)会扩展为空字符串?

Msbuild 为什么%(Identity)会扩展为空字符串?,msbuild,Msbuild,我被告知,以下内容应创建一个包含元数据的文件项组,说明这些文件是否为只读: <?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Run" ToolsVersion="12.0"> <Target Name="Main">

我被告知,以下内容应创建一个包含元数据的文件项组,说明这些文件是否为只读:

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

这样行吗?如果是这样,我哪里出错了?

从目标中创建项目组时,似乎无法引用项目元数据

将脚本更改为:

<?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>
如果在脚本运行之前保证所有项目都存在,则可以将脚本更改为此。但是,我怀疑,因为您是从目标内部使用它,所以他们不会。在这种情况下,您可能必须求助于CreateItem任务

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