Come faccio a utilizzare un file batch per sostituire una string ricorsivamente nei file?

Nei miei file SQL, ho codificato la directory C:\ in tutti i routes di file di output, ma ci sono momentjs in cui il client desidera avere le uscite memorizzate in E:\ , ad esempio.

Come faccio a fare questo con solo batch? Ho pensato ad utilizzare PowerShell, ma non è abilitato sulle macchine client.

Che cosa vorrei fare:

  1. Recursivamente attraversa tutte le directory.
  2. In each directory, trovare C:\ e sostituire con E:\ .

Yuck, facendo ciecamente la sostituzione all'ingrosso come quella su un'intera directory di struttura di directory mi renderebbe nervoso. Ma se pensi che sia sicuro …

È potenzialmente complicato fare ciò che si desidera utilizzando il batch puro, a seconda del contenuto del file. Ma è facile fare con un'utilità ibrida JScript / batch che ho scritto chiamato REPL.BAT. L'utilità esegue la ricerca di regex e sostituisce su stdin e scrive il risultato in stdout. È script puro che funziona su qualsiasi macchina moderna di Windows da XP in avanti, quindi non richiede l'installazione di un file di .exe terze parti .exe . L'utilità e la documentazione REPL.BAT sono disponibili qui. .

Supponendo che tu abbia REPL.BAT nella tua directory corrente, o meglio ancora, da qualche parte all'interno del tuo PATH, allora il seguente semplice liner dovrebbe fare il trucco direttamente dalla row di command, senza bisogno di un batch.

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

È ansible rendere il caso di ricerca insensibile aggiungendo l'interruttore I

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

Oppure, se si preferisce uno script batch (con I switch)

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

Ho usato l'interruttore letterale L tutto; l'altra opzione è quella di uscire dal \ invece.

 repl "C:\\" "E:\\" I