我想写的MSBuild脚本,将执行一些预定义的目录上的任意文件的一些动作(例如打印其路径.)(指定为命令行上的属性)(F:\文件).
给出以下目录结构
F:\Files\TextFile.txt
F:\Files\Subdir1\ImageFile.bmp
F:\Files\Subdir1\SubSubdir\ImageFile2.bmp
F:\Files\Subdir1\SubSubdir\TextFile2.txt
Run Code Online (Sandbox Code Playgroud)
和MSBuild脚本
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="PrintNames" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TargetDir>F:\Files</TargetDir>
</PropertyGroup>
<ItemGroup>
<Files Include="$(TargetDir)\$(InputFiles)"/>
</ItemGroup>
<Target Name="PrintNames">
<Message Text="Files: @(Files, ', ')" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
使用设置为"**\*.bmp;**\*.txt"的InputFiles运行脚本仅适用于bmp文件.Txt文件取自当前工作目录,而不是"F:\ Files"
您必须解决两个问题:
很容易分别解决两个问题中的任何一个,但两者的结合实际上是棘手的.我有一个可能的解决方案,它可以工作,但缺点是你必须在模式定义中编码'*'字符.
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="PrintNames" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TargetDir>c:\temp\MyContent</TargetDir>
<InputFilesRelativeEsc>%2A%2A\%2A.bmp;%2A%2A\%2A.txt</InputFilesRelativeEsc>
</PropertyGroup>
<Target Name="PrintNames">
<ItemGroup>
<_TempGroup Include="$(InputFilesRelativeEsc)" />
</ItemGroup>
<CreateItem Include="@(_TempGroup->'$(TargetDir)\%(Identity)')">
<Output TaskParameter="Include" ItemName="_EvaluatedGroup" />
</CreateItem>
<Message Text="_EvaluatedGroup: %(_EvaluatedGroup.FullPath)" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
它的工作原理如下.属性InputFilesRelativeEsc是相对文件模式的列表.注意通配符是编码的(%2A是星号的十六进制代码).由于通配符已编码,因此_TempGroup当您Include将此模式添加到此组时,该组不会尝试搜索和提取文件列表.现在_TempGroup是一个由两个元素组成的小组:**\*.bmp和**\*.txt.既然你有一个真正的小组,你可以改变它.唯一的复杂因素是运行转换的正常MSBuild机制不会扩展通配符.你必须使用较旧的CreateItem任务.该CreateItem任务实际上已被MSBuild团队声明弃用,但它仍然有效.