代码之家  ›  专栏  ›  技术社区  ›  Magnus Lindhe

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

  •  7
  • Magnus Lindhe  · 技术社区  · 15 年前

    如果项目列表中缺少任何文件,我将运行任务。我该怎么做?

    我当前的脚本有一个“源”文件@(mycommfiles)列表,我使用以下任务转换另一个“目标”文件@(myinteroplibs)列表:

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

    我想检查@(myinteroplibs)中的任何文件是否丢失,并运行将创建它们的任务。

    3 回复  |  直到 10 年前
        1
  •  3
  •   Crippledsmurf    15 年前

    我对msbuild不是很有经验,因此可能会有比这更好的解决方案,但您可以编写一个file exist任务,该任务获取文件列表并将每个文件传递到文件。exists如果确实存在,则返回true,否则返回false,然后根据结果作出反应。

    抱歉,我不能提供代码来帮助您,我对msbuild sytax的了解不强

        2
  •  4
  •   Scott Weinstein    15 年前

    如果您只需要创建丢失的文件,而没有得到丢失的文件列表,您可以 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)"/>
    
        3
  •  1
  •   Paul Williams    10 年前

    使用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属性,以便它将循环遍历这些项。