Como uso um arquivo em lotes para substituir recursivamente uma string em arquivos?

1

Nos meus arquivos SQL, eu codifiquei o diretório C:\ em todos os caminhos do arquivo de saída, mas há momentos em que o cliente deseja ter as saídas armazenadas em E:\ , por exemplo.

Como faço para fazer isso apenas com lote? Pensei em usar o PowerShell, mas ele não está habilitado nas máquinas clientes.

O que eu gostaria de fazer:

  1. Percorrer recursivamente todos os diretórios.
  2. Em cada diretório, encontre C:\ e substitua por E:\ .
por Bob. 28.08.2013 / 22:16

1 resposta

1

Porra, fazer cegamente uma substituição por atacado como essa em uma estrutura de árvore de diretório inteira me deixaria nervosa. Mas se você acha que é seguro ...

É potencialmente complicado fazer o que você deseja usando o lote puro, dependendo do conteúdo do arquivo. Mas é fácil fazer com um utilitário JScript / batch híbrido que escrevi chamado REPL.BAT. O utilitário executa a pesquisa de regex e substitui o stdin e grava o resultado em stdout. É um script puro que é executado em qualquer máquina moderna do Windows a partir do XP, portanto, não requer a instalação de nenhum arquivo .exe de terceiros. O utilitário REPL.BAT e a documentação estão disponíveis aqui. .

Supondo que você tenha o REPL.BAT em seu diretório atual, ou melhor ainda, em algum lugar dentro de seu PATH, então o simples liner a seguir deve fazer o truque diretamente da linha de comando, sem necessidade de lote.

for /r %F in (*.sql) do @(type "%F"|repl "C:\" "E:\" >"%F.new"&move /y "%F.new" "%F" L >nul)

Você pode tornar o caso de pesquisa insensível, adicionando a opção I .

for /r %F in (*.sql) do @(type "%F"|repl "C:\" "E:\" I >"%F.new"&move /y "%F.new" "%F" L >nul)

Ou se preferir um script em lote (com I switch)

@echo off
for /r %%F in (*.sql) do (
  type "%%F"|repl "C:\" "E:\" LI >"%%F.new"
  move /y "%%F.new" "%%F" >nul
)

Eu usei a opção L literal por toda parte; a outra opção é escapar do \ .

repl "C:\" "E:\" I
    
por 29.08.2013 / 00:45

Tags