我如何检查,如果任何文件中的项目清单存在使用msbuild?

StackOverflow https://stackoverflow.com/questions/802070

  •  03-07-2019
  •  | 
  •  

我要运行一个任务,如果任何文件中的项目清单缺失。我要怎么做?

我前脚本中有一个列表中的"源"的文件@(MyComFiles),我翻译的另一个列表中的"目的地"的文件@(MyInteropLibs),使用以下任务:

<CombinePath BasePath="$(MyPath)\interop" 
             Paths="@(MyComFiles->'%(filename).%(extension)')">
    <Output TaskParameter="CombinedPaths" 
            ItemName="MyInteropLibs" />
</CombinePath>

我要检查,如果任何文件@(MyInteropLibs)失踪和运行一个任务,将创建它们。

有帮助吗?

解决方案

我不是非常有经验的与MSBuild所以有可能是更好的解决方案于这个,但你可以写一FilesExist任务,考文件列表,并通过每个文件的文件。存在返回的真实的,如果他们确实存在假和magnar反应基于结果

对不起我不能提供代码,以帮助出,我的知识的MSBuild sytax不强

其他提示

如果你只需要创建丢失的文件,而不是获取缺少的文件列表,那么你可以触摸任务,如果文件不存在,将创建。

<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)"/>

您可以使用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属性,以便它遍历项目。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top