Copiando arquivos que correspondem a um padrão, mas não a outro

0

Eu tenho vários arquivos que seguem um padrão como este:

<BaseName> . <Version> [ - <Tag> - <#> ] . <Extension>

Por exemplo:

basename.1.0.0.ext
basename.1.0.0-aaa-1.ext
basename.1.0.0-aaa-2.ext
basename.1.0.0-aaa-3.ext
basename.1.0.0-bbb-1.ext
basename.1.0.0-bbb-2.ext
basename.1.0.0-bbb-3.ext

Agora eu preciso escrever um estrito que copie apenas o arquivo com uma determinada parte 'tag' (ou nenhuma 'tag') de uma pasta de destino. Por exemplo:

xcopy *-aaa-*.ext \server\path /f /y

Copia apenas arquivos com a tag 'aaa'. Por enquanto, tudo bem.

O problema é que o script também precisa funcionar para arquivos sem 'tag', basicamente eu preciso de tudo que corresponda a *.ext exceto o que corresponde a *-*.ext .

Infelizmente, tenho várias restrições aqui:

  • Não consigo alterar o padrão de nome ou a localização desses arquivos.
  • A parte da 'versão' não é conhecida, então *.1.0.0.ext não funcionará.
  • A "versão" não tem tamanho fixo, por isso *.?.?.?.ext não funcionará.
  • O parâmetro exclude xcopy não aceita um padrão, apenas uma lista de arquivos, então isso não funcionará.
  • Estou preso usando scripts em lote para isso. A invocação do PowerShell não está totalmente fora de questão, mas exigiria uma quantidade razoável de sobrecarga para que funcionasse, portanto, gostaria de evitar isso, se possível.
  • O script atual terá que ser assim:

    xcopy "%SOURCE%" "%DEST%" /f /y
    

    E as variáveis usadas por esse script serão salvas em um arquivo de configuração externo.

Como posso escrever este script para que ele funcione com qualquer conjunto de arquivos, tanto uma 'tag' específica quanto qualquer 'tag'?

    
por p.s.w.g 17.04.2014 / 19:19

2 respostas

1

foo.bat:

dir /b %3 > exclude_list.txt
xcopy %1 %2 /f /y /EXCLUDE:exclude_list.txt

Para exclusões como no seu exemplo:

call foo.bat "C:\source\*.ext" "C:\destination\" "*-*.ext"

Para nenhuma exclusão (hack inelegant):

call foo.bat "C:\source\*.ext" "C:\destination\" "A_STRING_THAT_CANNOT_MATCH"

Veja também Robocopy alterne /xf {filename}

    
por 17.04.2014 / 21:20
0

Então é isso que estou usando agora:

for /f "delims=" %%f in ('dir /b "*.ext" ^| findstr "%TAG%"') do (
    xcopy "%ff" %DEST% /f /y
)

Então, para copiar uma determinada tag, basta especificar TAG=-aaa- e você pode especificar várias tags separadas por espaços, como TAG=-aaa -bbb- .

A desvantagem é que, para implantar os arquivos que não têm uma tag, você teria que fazer algo realmente feio como TAG=^[^-]*$ . Embora eu possa refatorar isso no futuro, também é necessária uma variável para especificar o /v flag (que inverte o comportamento de findstr ), mas isso não parece necessário no momento.

    
por 17.04.2014 / 22:06