Toplu iş dosyasında dize değişimi


103

Aşağıdaki komutu kullanarak bir toplu iş dosyasındaki dizeleri değiştirebiliriz

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

Bu çizgiler iyi çalışır ve "sandalyenin üzerinden atla" dizesini "masanın üzerinden atla" olarak değiştirir. Şimdi dizedeki "sandalye" kelimesini bir değişkenle değiştirmek istiyorum ve bunu nasıl yapacağımı bilmiyorum.

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

Herhangi bir fikir?


bir yarasa dosyası içindeki dizenin , çok daha gayri resmi bir yanıta sahip komut satırı parametre dizesiyle nasıl değiştirileceğinin olası bir kopyası (yine de buradaki yanıtlarla aynı çözümlere sahiptir)
Fr0sT

1
şimdi kimin ilk olduğu önemli değil, ama aynı soruları birbirine bağlamak ve en
çözülemez

Yanıtlar:


78

! Kullanabilirsiniz, ancak ENABLEDELAYEDEXPANSION anahtar setine sahip olmanız gerekir.

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

4
Peki ya strkendisi gecikmiş genişlemeden kaynaklanıyorsa? set str=!str:chair=!word!!doğru çalışmıyor.
ImaginaryHuman072889

1
Anlıyorum "jump over the !word!".
bers

89

Aşağıdaki küçük numarayı kullanabilirsiniz:

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

callOrada, değişken genişleme başka bir katman neden gerekli orijinal alıntı yapma %belirtileri ama hepsi sonunda dışarı çalışır.


Bu çözümü beğendim, kaçan dizeler toplu iş dosyalarında her zaman sorunludur, ENABLEDELAYEDEXPANSION endişelenecek başka bir karakter ekler.
Anders

9
Joey tarafından sağlanan cevapla ilgili önemli bir şey . Kodu çalışması için toplu iş dosyasına koymanız gerekir. Sadece komut satırında test ederseniz, beklenmedik bir şekilde geri dönecektir %"jump over the "word%%%. Sadece toplu iş dosyalarındaki ve komut satırındaki kodun farklı sonuçlar üretebileceğini unutmayın.
dadhi

2
Dadhi'nin yerinde yapılan yorumunu temel alan komut satırı çözümü burada: stackoverflow.com/questions/29944902/… .
Kenn Sebesta

3
Çevre değişkeni her iki konumda veya hem "önce" hem de "sonra" konumlarında olmak üzere her iki şekilde de çalıştığı için bu yanıta oy vermek: set word=table set str="jump over the chair" call set str=%%str:chair=%word%%% echo %str% set word1=chair set word2=desk set str="jump over the chair" call set str=%%str:%word1%=%word2%%% echo %str%'
Tom Warfield

0

Joey's Answer'ı bir işlev oluşturmak için kullanabildim:

Şu şekilde kullanın:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET "MYTEXT=jump over the chair"
echo !MYTEXT!
call:ReplaceText "!MYTEXT!" chair table RESULT
echo !RESULT!

GOTO:EOF

Ve bu İşlevler, Toplu İş Dosyanızın altındaki.

:FUNCTIONS
@REM FUNCTIONS AREA
GOTO:EOF
EXIT /B

:ReplaceText
::Replace Text In String
::USE:
:: CALL:ReplaceText "!OrginalText!" OldWordToReplace NewWordToUse  Result
::Example
::SET "MYTEXT=jump over the chair"
::  echo !MYTEXT!
::  call:ReplaceText "!MYTEXT!" chair table RESULT
::  echo !RESULT!
::
:: Remember to use the "! on the input text, but NOT on the Output text.
:: The Following is Wrong: "!MYTEXT!" !chair! !table! !RESULT!
:: ^^Because it has a ! around the chair table and RESULT
:: Remember to add quotes "" around the MYTEXT Variable when calling.
:: If you don't add quotes, it won't treat it as a single string
::
set "OrginalText=%~1"
set "OldWord=%~2"
set "NewWord=%~3"
call set OrginalText=%%OrginalText:!OldWord!=!NewWord!%%
SET %4=!OrginalText!
GOTO:EOF

Ve toplu iş dosyanızın üstüne "SETLOCAL ENABLEDELAYEDEXPANSION" eklemeniz GEREKİR, aksi takdirde bunların hiçbiri düzgün çalışmayacaktır.

SETLOCAL ENABLEDELAYEDEXPANSION
@REM # Remember to add this to the top of your batch file.

-4

Bu iyi çalışıyor

@echo off    
set word=table    
set str=jump over the chair    
set rpl=%str:chair=%%word%    
echo %rpl%

5
Üzgünüm, iyi görünüyor, AMA yanlış! Kelimeyi kaldırır ve kelimeyi chairekler table, ancak iki kelimeyi değiş tokuş etmez. Kelimeyi overile değiştirmeyi deneyin underve şunu elde edinjump the chairunder
2019
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.