使用文件::存在的条件不起作用
本文关键字:条件 不起作用 存在 文件 | 更新日期: 2023-09-27 18:32:10
我目前正在创建我的第一个MSBuild脚本。
我有一个标签"文件夹",可以在给定的根路径中找到所有目录:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<Target Name="Build">
<PropertyGroup>
<RootFolder>tmp</RootFolder>
</PropertyGroup>
<ItemGroup>
<Folders Include="$([System.IO.Directory]::GetDirectories("$(RootFolder)"))"/>
</ItemGroup>
<Message Text="@(Folders -> '%(FullPath)'Bin'Debug'%(Filename)%(Extension).dll', ';')"/>
</Target>
</Project>
这很完美。我的问题是我只需要指定文件所在的目录。我尝试了这样的条件
Condition="$([System.IO.File]::Exists("%(FullPath)''Bin''Debug''%(Filename)%(Extension).dll"))"
作为文件夹标记。
此脚本运行没有任何错误,但我的列表为空。为什么?
还有其他解决方案可以检查文件吗?
我使用了这个解决方案,因为它使用 C#,而且我是 C# 开发人员。
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<Target Name="Build">
<PropertyGroup>
<RootFolders>tmp</RootFolders>
</PropertyGroup>
<GetFiles rootFolders="$(RootFolders)">
<Output PropertyName="Files" TaskParameter="Files" />
</GetFiles>
<Message Text="$(Files)" />
</Target>
<UsingTask
TaskName="GetFiles"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)'Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<rootFolders ParameterType="System.String" Required="true" />
<files ParameterType="System.String" Output="true" />
</ParameterGroup>
<Task>
<Using Namespace="System" />
<Using Namespace="System.IO" />
<Using Namespace="System.Linq" />
<Code Type="Fragment" Language="cs">
<![CDATA[
Func<string, string> BuildFilePath = path => path + @"'Bin'Debug'" + Path.GetFileName(path) + ".dll";
var dirs = Directory.GetDirectories(rootFolders).Where(x => File.Exists(BuildFilePath(x)));
files = string.Join("'n", dirs.Select(BuildFilePath));
]]>
</Code>
</Task>
</UsingTask>
</Project>
AFAIK,Condition
执行并检查项目的整个声明(即 <Folders ..>
标记)。
我认为,您需要遍历集合(例如使用目标/任务批处理)并检查文件是否存在于集合中的每个文件夹文件夹中。然后,如果文件存在 - 将其包含在新的<FoldersFiletered>
项集合中。
注意:我现在没有时间测试代码,但大致是这个想法:
<Target Name="FilterFolders"
Inputs="@(Folders)"
Outputs="%(FullPath)">
<ItemGroup>
<FoldersFiltered Include="@(Folders->'%(FullPath)')"
Condition="$([System.IO.File]::Exists("@(Folders->'%(FullPath)'''Bin''Debug''YourFile.dll"))" />
</ItemGroup>
</Target>