- 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:
- Usando
forfiles
com a opção@RelPath
- usando um
for /f
analisando a saída de umdir /B/S "%1\*.xmp"
e em seguida, trocarindir
comoutdir
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!"
)