我有一个脚本,试图从特定目录中的所有文件中构建一个ItemGroup,同时排除具有特定名称的文件(无论扩展名如何)。
要排除的文件列表最初包含文件扩展名,我使用Community Tasks的RegexReplace将扩展名替换为星号。 然后在项目的Exclude属性中使用此列表。 由于某种原因,尽管列表似乎正确,但文件并未正确排除。
为了尝试找到原因,我创建了一个测试脚本(下面),其中有两个任务:第一个任务以两种不同的方式初始化两个属性,这些属性是文件模式列表。 第二个任务打印两个属性以及使用这些属性在Exclude属性中生成的文件。
属性的值似乎相同,但结果组不同。 这是怎么可能的?
请注意,
最终我想使用以与
要排除的文件列表最初包含文件扩展名,我使用Community Tasks的RegexReplace将扩展名替换为星号。 然后在项目的Exclude属性中使用此列表。 由于某种原因,尽管列表似乎正确,但文件并未正确排除。
为了尝试找到原因,我创建了一个测试脚本(下面),其中有两个任务:第一个任务以两种不同的方式初始化两个属性,这些属性是文件模式列表。 第二个任务打印两个属性以及使用这些属性在Exclude属性中生成的文件。
属性的值似乎相同,但结果组不同。 这是怎么可能的?
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
DefaultTargets="Init;Test" ToolsVersion="3.5">
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<Target Name="Init">
<ItemGroup>
<OriginalFilenames Include="TestDir\SampleProj.exe"/>
<OriginalFilenames Include="TestDir\SampleLib1.dll"/>
</ItemGroup>
<RegexReplace Input="@(OriginalFilenames)" Expression="\.\w+$" Replacement=".*">
<Output TaskParameter="Output" ItemName="PatternedFilenames"/>
</RegexReplace>
<PropertyGroup>
<ExcludeFilesA>TestDir\SampleProj.*;TestDir\SampleLib1.*</ExcludeFilesA>
<ExcludeFilesB>@(PatternedFilenames)</ExcludeFilesB>
</PropertyGroup>
</Target>
<Target Name="Test">
<Message Text='ExcludeFilesA: $(ExcludeFilesA)' />
<Message Text='ExcludeFilesB: $(ExcludeFilesB)' />
<ItemGroup>
<AllFiles Include="TestDir\**"/>
<RemainingFilesA Include="TestDir\**" Exclude="$(ExcludeFilesA)"/>
<RemainingFilesB Include="TestDir\**" Exclude="$(ExcludeFilesB)"/>
</ItemGroup>
<Message Text="
**AllFiles**
@(AllFiles, '
')" />
<Message Text="
**PatternedFilenames**
@(PatternedFilenames, '
')" />
<Message Text="
**RemainingFilesA**
@(RemainingFilesA, '
')" />
<Message Text="
**RemainingFilesB**
@(RemainingFilesB, '
')" />
</Target>
</Project>
输出(为了清晰起见,有所改动):
ExcludeFilesA: TestDir\SampleProj.*;TestDir\SampleLib1.*
ExcludeFilesB: TestDir\SampleProj.*;TestDir\SampleLib1.*
AllFiles:
TestDir\SampleLib1.dll
TestDir\SampleLib1.pdb
TestDir\SampleLib2.dll
TestDir\SampleLib2.pdb
TestDir\SampleProj.exe
TestDir\SampleProj.pdb
PatternedFilenames:
TestDir\SampleProj.*
TestDir\SampleLib1.*
RemainingFilesA:
TestDir\SampleLib2.dll
TestDir\SampleLib2.pdb
RemainingFilesB:
TestDir\SampleLib1.dll
TestDir\SampleLib1.pdb
TestDir\SampleLib2.dll
TestDir\SampleLib2.pdb
TestDir\SampleProj.exe
TestDir\SampleProj.pdb
请注意,
ExcludeFilesA
和ExcludeFilesB
看起来相同,但生成的组RemainingFilesA
和RemainingFilesB
不同。最终我想使用以与
ExcludeFilesB
相同方式生成的模式来获取列表RemainingFilesA
。你能提供一种方法吗?还是我必须完全重新考虑我的方法?
<FooItem Include="bar*baz" />
中实际转义星号,以便稍后可以直接获取它而不进行文件全局匹配,但我找不到任何相关信息。您的研究帮助了我 - 使用%2a
关闭了扩展,并且稍后命令中的所有@->
转换都得到了星号。 - quetzalcoatl