В командной строке очень неудобно манипулировать строками. Удаление содержимого %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
, указывающий абсолютный путь, из которого был запущен командный файл.