2

Вдохновленный во время написания моего другого вопроса (который я сейчас удалил) (иногда общение с уткой помогает), я думаю, что нашел решение своей проблемы, но я не знаю, как это сделать.

У меня есть следующая команда в пакетном скрипте

FOR /R %1 %%G IN (*) DO rdiff.exe signature "%%G" | 7za.exe a -mx0 -si"%%G" signatures.7z

Я хотел бы удалить текст %1 из %%G в аргументе 7zip -si но оставить его в аргументе rdiff.

Как бы я поступил так?

1 ответ1

2

В командной строке очень неудобно манипулировать строками. Удаление содержимого %1 из начала %G потребует подсчета символов %1 (перебрать символы и увеличить счетчик на единицу), а затем использовать синтаксис подстроки (%var:~start,length%).

Использовать forfiles должно быть намного проще, поскольку он имеет встроенную командную переменную для доступа к относительному пути файла (@relpath).

Это должно работать:

forfiles /S /P %1 /C "cmd /V:on /C if @isdir==FALSE set R=@relpath&set R=!R:~3,-1!&%~dp0rdiff signature @path | %~dp07za a -mx0 -si\"!R!\" %~dp0signatures.7z"

Подробности:

  • /S делает файлы рекурсивными.

  • /P %1 указывает путь.

  • /C "cmd /V:on /C ... выполняется ... в подоболочке с отложенным расширением переменной (!var! синтаксис).

  • if @isdir==FALSE проверяет наличие файла (а не каталога).

  • set R=@relpath сохраняет относительный путь в переменной с именем R

  • set R=!R:~3,-1! удаляет строку в начале "\." и завершающая двойная кавычка.

  • %~dp0 forfiles изменяет каталоги для выполнения команды, указав %~dp0 , указывающий абсолютный путь, из которого был запущен командный файл.

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