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:
-
/S
torna os arquivos recursivos. -
/P %1
especifica o caminho. -
/C "cmd /V:on /C ...
executa...
em um subshell com expansão de variável atrasada (!var!
syntax). -
if @isdir==FALSE
verifica a presença de um arquivo (em vez de um diretório). -
set R=@relpath
armazena o caminho relativo em uma variável chamadaR
. -
set R=!R:~3,-1!
remove a string no início"\."
e a aspa dupla direita. -
%~dp0
forfiles altera os diretórios para executar o comando, especificando%~dp0
para obter o caminho absoluto do qual o arquivo em lote foi executado.