Como Duplicar a Estrutura do Subdiretório de Entrada para Saída de Arquivo em Lote?

0

Eu quero usar este script de uma linha para executar um script awk em todos os arquivos * .xmp em um diretório e colocar os arquivos processados em um segundo diretório com a mesma estrutura de subdiretórios.

O arquivo em lote FixXMP.bat tem esta aparência:

 forfiles -p "%1" -s -m *.xmp /c "cmd /c gawk -f fixxmp.awk < @file > %2\@file"

Eu corro o script assim:

 FixXMP indir outdir

onde indir é o diretório que contém os arquivos de entrada nos subdiretórios e outdir é onde os subdiretórios serão duplicados e os arquivos de saída armazenados.

Isso funciona bem, exceto que todos os arquivos de saída vão no diretório de saída sem duplicar a estrutura do subdiretório de entrada.

Eu não tenho ideia de como fazer isso. Alguém pode me ajudar a mudar este script para duplicar a estrutura de subdiretórios de entrada para a saída?

Obrigado,

Mike

    
por MikeA01730 17.09.2017 / 05:34

1 resposta

0

  • Uma vez que os arquivos for recursão em subpastas, o destino estático %2 não corresponde mais.
  • Você também precisa usar <@path para o arquivo de entrada

Eu vejo duas soluções possíveis:

  1. Usando forfiles com a opção @RelPath
  2. usando um for /f analisando a saída de um dir /B/S "%1\*.xmp" e em seguida, trocar indir com outdir no encontrado drive: \ path \ filename.ext.

Se você primeiro duplicar a estrutura de diretórios com xcopy /S/T/E "%InDir%" "%OutDir%\" você não precisa verificar se cada diretório de destino já existe (como já foi mencionado no meu comentário).

Contanto que fixXMP.awk esteja na mesma pasta que fixXMP.bat :

:: FixXMP.bat
@Echo off
xcopy /S/T/E "%~1" "%~2\"
forfiles -p "%~1" -s -m *.xmp /c "cmd /c gawk -f %~dp0\fixXMP.awk <@path >%~2\@relpath"

Exemplo de saída em minha ramdrive A: antes de executar o lote:

> tree A:\ /F
A:\
├───InDir
│   └───Sub1
│       └───Sub2
│               Test.xmp
│
└───OutDir

e depois:

> tree A:\ /F
A:\
├───InDir
│   └───Sub1
│       └───Sub2
│               Test.xmp
│
└───OutDir
    └───Sub1
        └───Sub2
                Test.xmp

Variante de lote com for /f e o mesmo resultado:

:: FixXMP.bat
@Echo off & SetLocal EnableDelayedExpansion
xcopy /S/T/E "%~1" "%~2\"
For /f "delims=" %%A in ('Dir /B/S "%1\*.xmp" ') Do (
    Set "InFile=%%~fA"
    Set "OutFile=!InFile:%~1=%~2!"
    gawk -f "%~dp0\fixXMP.awk" <"%%A" >"!OutFile!"
)
    
por 18.09.2017 / 15:19

Tags