如何使用msbuild选择所有只读文件?

如何使用msbuild选择所有只读文件?,msbuild,Msbuild,我正在尝试编写一个MsBuild脚本来压缩一些文件。我需要将文件夹中的所有只读文件递归地选择到要添加到zip的项目组中 我使用的是community tasks Zip任务,但是我很难根据文件的属性来选择文件 是否有现成的方法来完成此任务,或者我需要编写自定义任务 谢谢你的帮助。你看过社区构建任务了吗 它有一个zip任务和一个属性更改任务——它们应该可以让您完成大部分任务。这似乎是通过一些肮脏的命令行使用来完成的 <Exec Command="dir .\RelPath\ToFolder\

我正在尝试编写一个MsBuild脚本来压缩一些文件。我需要将文件夹中的所有只读文件递归地选择到要添加到zip的项目组中

我使用的是community tasks Zip任务,但是我很难根据文件的属性来选择文件

是否有现成的方法来完成此任务,或者我需要编写自定义任务


谢谢你的帮助。

你看过社区构建任务了吗


它有一个zip任务和一个属性更改任务——它们应该可以让您完成大部分任务。

这似乎是通过一些肮脏的命令行使用来完成的

<Exec Command="dir .\RelPath\ToFolder\ToSearchIn /S /AR /B > readonlyfiles.temp.txt"/>
<ReadLinesFromFile File="readonlyfiles.temp.txt">
    <Output TaskParameter="Lines" ItemName="ReadOnlyFiles"/>
</ReadLinesFromFile>
<Delete Files="readonlyfiles.temp.txt"/>

这将提供文件的绝对路径

要获取相对路径,请尝试以下操作:

<Exec Command="dir .\RelPath\ToFolder\ToSearchIn /S /AR /B > readonlyfiles.temp.txt"/>
<FileUpdate Files="readonlyfiles.temp.txt"
            Multiline="True"
            Regex="^.*\\RelPath\\ToFolder\\ToSearchIn"
            ReplacementText="RelPath\ToFolder\ToSearchIn"
            />
<ReadLinesFromFile File="readonlyfiles.temp.txt">
    <Output TaskParameter="Lines" ItemName="ReadOnlyZipFiles"/>
</ReadLinesFromFile>
<Delete Files="readonlyfiles.temp.txt"/>

您可以使用(添加到msbuild 4)确定文件是否为只读,如下所示:

<ItemGroup>
  <MyFiles Include="Testing\*.*" >
    <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)" Condition="%(MyFiles.ReadOnly) != True"/>
  <Message Text="%(MyFiles.Identity) ReadOnly" Condition="%(MyFiles.ReadOnly) == True" />
</Target>

真的

您好,是的,我应该说-我正在使用他们的Zip任务。正如您所说,Attrib任务将更改属性,但我不想更改它们,我只想根据它们的属性选择文件。刚刚尝试了此操作,但出现错误MSB4184:无法计算表达式“[System.IO.File]::GetAttributes(“”)”。该路径不是合法形式。似乎%(Identity)正在扩展为空字符串。我正在使用ToolsVersion=“12.0”。您能告诉我如何执行msbuild文件吗?是从命令行来的吗?我能很好地理解上面的脚本。也许你执行它的方式或者你写脚本的方式有些不同。最好在msbuild脚本中发布一个单独的问题。似乎有人已经遇到了我遇到的问题,并提出了以下问题:引用的问题将适用于msbuild 4.0,但在4.0之前不适用。我的答案也是如此。我怀疑您实际上使用的是旧版本的msbuild。