如何使用msbuild检查项目列表中是否存在任何文件?

Mag*_*dhe 7 msbuild

如果项目列表中的任何文件丢失,我想运行一个任务.我怎么做?

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

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

我想检查是否缺少@(MyInteropLibs)中的任何文件并运行将创建它们的任务.

Sco*_*ein 6

如果您只需要创建丢失的文件,而不需要获取丢失的文件的列表,您可以使用touch 任务,如果文件不存在,该任务将创建。

<Touch Files="@(MyInteropLibs)" AlwaysCreate="True" />
Run Code Online (Sandbox Code Playgroud)

如果您只想创建丢失的文件,并避免更改现有文件的时间戳,那么批处理可以帮助您

<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True" 
       Condition=" ! Exists(%(MyInteropLibs.FullPath)) "/>
Run Code Online (Sandbox Code Playgroud)

如果您想要创建的文件列表

<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True" 
       Condition=" ! Exists(%(MyInteropLibs.FullPath)) ">
    <Output TaskParameter="TouchedFiles" ItemName="CreatedFiles"/>
</Touch>
<Message Text="Created files = @(CreatedFiles)"/>
Run Code Online (Sandbox Code Playgroud)


Cri*_*urf 3

我对 MSBuild 不太有经验,因此可能有比这更好的解决方案,但您可以编写一个 FilesExist 任务,该任务获取文件列表并将每个文件传递给 File.Exists 如果它们确实存在则返回 true,否则返回 false,然后根据结果

抱歉,我无法提供代码来帮助您,我对 MSBuild sytax 的了解并不强

  • MSBuild 似乎没有内置该功能。我在 MSBuild 扩展包或 MSBuild 社区任务中也没有看到此类功能。正如 Crippledsmurf 所建议的,您可以创建自己的自定义 MSBuild 任务来满足您的需要。然后,您可以在构建文件中引用该 dll,并根据需要调用该任务。 (2认同)