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.