Como eu substituo o texto dentro de um comando FOR?

2

Inspirado enquanto escrevia minha outra pergunta (que eu agora deletei) (algumas vezes falando para o pato ajuda) Acho que encontrei uma solução para o meu problema, mas não sei como fazer isso.

Eu tenho o seguinte comando em um script em lote

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

O que eu gostaria de fazer é remover o texto de %1 de %%G no argumento 7zip -si , mas deixá-lo no argumento rdiff.

Como eu faria isso?

    
por Scott Chamberlain 15.03.2013 / 17:33

1 resposta

2

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 chamada R .

  • 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.

por 15.03.2013 / 20:05