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