如果缺少项目列表中的任何文件,我想运行任务。我该怎么做?
我当前的脚本有一个“源”文件列表@(MyComFiles),我使用以下任务翻译另一个“目标”文件列表@(MyInteropLibs):
<CombinePath BasePath="$(MyPath)\interop"
Paths="@(MyComFiles->'%(filename).%(extension)')">
<Output TaskParameter="CombinedPaths"
ItemName="MyInteropLibs" />
</CombinePath>
我想检查@(MyInteropLibs)中的任何文件是否缺失并运行将创建它们的任务。
答案 0 :(得分:4)
如果您只需要创建丢失的文件,而不是获取缺少的文件列表,可以使用touch task,如果文件不存在,将创建该文件。
<Touch Files="@(MyInteropLibs)" AlwaysCreate="True" />
如果您只想创建丢失的文件,并避免更改现有文件的时间戳,那么批处理可以帮助
<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True"
Condition=" ! Exists(%(MyInteropLibs.FullPath)) "/>
如果您想要创建的文件列表,那么
<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True"
Condition=" ! Exists(%(MyInteropLibs.FullPath)) ">
<Output TaskParameter="TouchedFiles" ItemName="CreatedFiles"/>
</Touch>
<Message Text="Created files = @(CreatedFiles)"/>
答案 1 :(得分:3)
我对MSBuild不太熟悉,所以可能有比这更好的解决方案但是你可以编写一个FilesExist任务,它接受文件列表并将每个文件传递给File.Exists如果确实存在则返回true,否则返回false然后反应根据结果
抱歉,我无法提供帮助的代码,我对MSBuild sytax的了解并不强烈
答案 2 :(得分:1)
您可以使用Exec轻松找到。
测试是否存在所有文件集:DOS FOR / D命令接受以分号分隔的文件列表 - 即展平的项目数组。
<!-- All exist -->
<Exec
Command="for /D %%i in (@(MyFiles)) do if not exist %%i exit 1"
IgnoreExitCode="true">
<Output TaskParameter="ExitCode" PropertyName="ExistExitCode"/>
</Exec>
测试是否存在任何一组文件:DOS DIR命令接受以分号分隔的文件列表。如果它在列表中找到任何文件,则将%ERRORLEVEL%设置为0,如果找不到,则将其设置为非零。 (这是更简单的情况,但不解决原始问题......)
<!-- Any exists -->
<Exec Command="dir /B @(MyFiles)" IgnoreExitCode="true">
<Output TaskParameter="ExitCode" PropertyName="DirExitCode"/>
</Exec>
然后很可能你会想要根据输出定义一个布尔属性。
编辑:BTW这是代码味道。通常当您发现自己想要这样做时,它表明您应该设置目标的Outputs属性,以便它遍历项目。