A manipulação de strings é muito difícil no prompt de comando. Remover o conteúdo de %1 do início de %G envolveria contar os caracteres de %1 (percorrer os caracteres e aumentar um contador em um) e depois usar a sintaxe de substring ( %var:~start,length% ).
O uso de forfiles deve ser muito mais simples, pois possui uma variável de comando interna para acessar o caminho relativo do arquivo ( @relpath ).
Isso deve funcionar:
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"
Detalhes:
-
/Storna os arquivos recursivos. -
/P %1especifica o caminho. -
/C "cmd /V:on /C ...executa...em um subshell com expansão de variável atrasada (!var!syntax). -
if @isdir==FALSEverifica a presença de um arquivo (em vez de um diretório). -
set R=@relpatharmazena o caminho relativo em uma variável chamadaR. -
set R=!R:~3,-1!remove a string no início"\."e a aspa dupla direita. -
%~dp0forfiles altera os diretórios para executar o comando, especificando%~dp0para obter o caminho absoluto do qual o arquivo em lote foi executado.