Я хочу использовать этот однострочный сценарий для запуска сценария awk для всех файлов * .xmp в одном каталоге и помещения обработанных файлов во второй каталог с такой же структурой подкаталогов.

Пакетный файл FixXMP.bat выглядит так:

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

Я запускаю скрипт так:

 FixXMP indir outdir

где indir - каталог, содержащий входные файлы в подкаталогах, а outdir - каталог, в котором будут дублироваться подкаталоги и сохраняться выходные файлы.

Это прекрасно работает, за исключением того, что все выходные файлы помещаются в выходной каталог без дублирования структуры входного подкаталога.

Я понятия не имею, как это сделать. Может кто-нибудь помочь мне изменить этот сценарий, чтобы дублировать структуру подкаталога ввода для вывода?

Спасибо,

Майк

1 ответ1

0
  • Когда forfiles возвращается в подпапки, статическое назначение %2 больше не совпадает.
  • Также вам нужно использовать <@path для входного файла

Я вижу два возможных решения:

  1. Использование forfiles с опцией @RelPath
  2. используя for /f анализа вывода в dir /B/S "%1\*.xmp" , а затем обмениваться с indir outdir в найденном диске:\ путь \ имяфайла.рсш.

Если вы сначала дублируете структуру каталогов с помощью xcopy /S/T/E "%InDir%" "%OutDir%\" вам не нужно проверять, существует ли каждый отдельный каталог назначения (как уже было указано в моем комментарии).

При условии, что fixXMP.awk находится в той же папке, что и 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"

Пример вывода на мой ramdrive A: перед запуском пакета:

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

и после :

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

Пакетный вариант с for /f и тем же результатом:

:: 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!"
)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .