2010-05-05 20 views
68

Możemy zastąpić ciągi w pliku wsadowym za pomocą następującego poleceniawymiana String w pliku wsadowym

set str="jump over the chair" 
set str=%str:chair=table% 

Linie te działają dobrze i zmienić ciąg „skok przez krzesła” do „skoku przez stół”. Teraz chcę zastąpić słowo "chair" w łańcuchu pewną zmienną i nie wiem jak to zrobić.

set word=table 
set str="jump over the chair" 
?? 

Jakieś pomysły?

+0

możliwe duplikat [jak wymienić łańcuch wewnątrz pliku bat z parametrem wiersza poleceń string] (http://stackoverflow.com/questions/5816178/how-to-replace-string-inside-a-bat-file-with-command-line-parameter-string), który ma znacznie bardziej nieformalną odpowiedź (ma te same rozwiązania co tutaj odpowiedzi) – Fr0sT

+1

teraz nie ma znaczenia, kto był pierwszy, ale dobrze jest łączyć identyczne pytania i wskazywać na najbardziej niezniszczalną odpowiedź: – Fr0sT

Odpowiedz

56

Możesz użyć!, Ale musisz ustawić przełącznik ENABLEDELAYEDEXPANSION.

setlocal ENABLEDELAYEDEXPANSION 
set word=table 
set str="jump over the chair" 
set str=%str:chair=!word!% 
57

Można użyć następującego mały trick:

set word=table 
set str="jump over the chair" 
call set str=%%str:chair=%word%%% 
echo %str% 

call nie powoduje kolejną warstwę zmiennej ekspansji, co konieczne, aby zacytować oryginalne % znaki, ale to wszystko działa się w końcu.

+0

Podoba mi się to rozwiązanie, ucieczka przed ciągami zawsze jest problematyczna w plikach wsadowych, ENABLEDELAYEDEXPANSION dodaje tylko kolejną postać, o którą trzeba się martwić. – Anders

+5

Ważna sprawa dotycząca odpowiedzi udzielonej przez ** Joey **. Musisz umieścić kod w pliku wsadowym, aby działał. Jeśli po prostu przetestujesz go w linii poleceń, zwróci on nieoczekiwany skok "%" nad "słowem %%%". Należy pamiętać, że kod w plikach wsadowych oraz w wierszu poleceń może dawać różne wyniki. – dadhi

+0

W oparciu o komentarz do dadhi, rozwiązanie dla wiersza poleceń jest tutaj: https://stackoverflow.com/questions/29944902/how-to-replace-withperper-character-in-cmd-exe. –

-4

c:> replace.bat "123def789" "def" "456"


 replace.bat 

setlocal enabledelayedexpansion 
set data=%1 
set search=%2 
set replace=%3 
set "data=!data:%search%=%replace%!" 
echo %data% 
REM Use %data% here before calling endlocal. 
endlocal 
+0

Co to oznacza? Przyszli goście mogą w ogóle nie rozumieć tych kodów. – SteveFest

+0

tutaj chcę wspomnieć, że musisz użyć zmiennych danych przed endlokalnym. –

Powiązane problemy