Como faço para verificar se qualquer arquivo em uma lista de itens de existir usando msbuild?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu gostaria de executar uma tarefa se algum arquivo em uma lista de itens está faltando. Como posso fazer isso?

Meu script atual tem uma lista de arquivos "fonte" @ (MyComFiles) que traduzem uma outra lista de arquivos "Destino" @ (MyInteropLibs), usando a seguinte tarefa:

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

Eu quero verificar se algum dos arquivos no @ (MyInteropLibs) está em falta e executar uma tarefa que irá criá-los.

Foi útil?

Solução

Eu não sou muito experiente com MSBuild portanto, pode haver soluções melhores do que isso, mas você poderia escrever uma tarefa FilesExist que leva a lista de arquivos e passa cada arquivo para File.Exists retornar verdadeiro se eles existem e falso caso contrário e thenn reagir com base no resultado

Desculpe, não posso fornecer o código para ajudar, minha knowlege de MSBuild sytax não é forte

Outras dicas

Se você só precisa criar os arquivos ausentes, e não obter uma lista dos arquivos que estavam faltando puder lhe a tarefa toque , que irá criar se não existirem os arquivos.

<Touch Files="@(MyInteropLibs)" AlwaysCreate="True" />

Se você só quer criar os arquivos ausentes, e evitar a alteração timestamps dos arquivos existentes, seguida de dosagem pode ajudar

<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True" 
       Condition=" ! Exists(%(MyInteropLibs.FullPath)) "/>

Se você quer uma lista dos arquivos criados, então

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

Você pode descobrir muito facilmente usando Exec.

Para testar se ALL de um conjunto de arquivos existe:. O comando DOS FOR / D aceita uma lista separada por ponto e vírgula de arquivos - ou seja, um achatada variedade item

<!-- All exist -->
<Exec
  Command="for /D %%i in (@(MyFiles)) do if not exist %%i exit 1"
  IgnoreExitCode="true">
  <Output TaskParameter="ExitCode" PropertyName="ExistExitCode"/>
</Exec>

Para testar se qualquer um de um conjunto de arquivos existe: O comando DOS DIR aceita uma lista separada por ponto e vírgula de arquivos. Ele define o% ERRORLEVEL% para 0 se encontra todos os arquivos na lista, diferente de zero se ele não o encontra. (Este é o caso mais simples, mas ele faz não endereço a pergunta original ...)

<!-- Any exists -->
<Exec Command="dir /B @(MyFiles)" IgnoreExitCode="true">
  <Output TaskParameter="ExitCode" PropertyName="DirExitCode"/>
</Exec>

Em seguida, muito provavelmente você vai querer definir uma propriedade booleana com base na saída.

Editar : BTW este é um cheiro de código. Normalmente, quando você encontrar-se querer fazer isso, é uma indicação de que você deve definir a propriedade Saídas do alvo assim que fará um loop sobre os itens.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top