स्ट्रिंग बैच फ़ाइल में प्रतिस्थापन


102

हम निम्न आदेश का उपयोग करके एक बैच फ़ाइल में तारों को बदल सकते हैं

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

ये लाइनें ठीक काम करती हैं और स्ट्रिंग को "कुर्सी पर कूदें" "टेबल पर कूदने" के लिए बदल देती हैं। अब मैं स्ट्रिंग में "कुर्सी" शब्द को कुछ चर के साथ बदलना चाहता हूं और मुझे नहीं पता कि यह कैसे करना है।

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

कोई विचार?


कमांड लाइन के पैरामीटर स्ट्रिंग के साथ एक बैट फाइल के अंदर स्ट्रिंग को बदलने के तरीके के संभावित डुप्लिकेट, जिसमें बहुत अधिक अनौपचारिक उत्तर हैं (इसके उत्तर के समान ही समाधान हैं)
Fr0sT

1
अब यह महत्वपूर्ण नहीं है कि पहले कौन था, लेकिन समान प्रश्नों को जोड़ना और सबसे
अपूरणीय

जवाबों:


79

आप उपयोग कर सकते हैं!, लेकिन आपके पास ENABLEDELAYEDEXPANSION स्विच सेट होना चाहिए।

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

4
लेकिन क्या होगा यदि strस्वयं विलंबित विस्तार से है? set str=!str:chair=!word!!सही ढंग से काम नहीं करता है।
काल्पनिक

मुझे मिलता है "jump over the !word!"
BERS

88

आप निम्न छोटी चाल का उपयोग कर सकते हैं:

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

callवहाँ, चर विस्तार की एक और परत का कारण बनता है यह आवश्यक मूल उद्धृत करने के लिए कर रही है %संकेत लेकिन यह सब अंत में बाहर काम करता है।


मुझे यह समाधान पसंद है, स्ट्रिंग्स से बचना बैच फ़ाइलों में हमेशा समस्याग्रस्त होता है, ENABLEDELAYEDEXPANSION बस एक और चरित्र को जोड़ता है चिंता करने के लिए।
एंडर्स

9
जॉय द्वारा प्रदान किए गए उत्तर के बारे में महत्वपूर्ण बात । यह काम करने के लिए आपको कोड को बैच फ़ाइल में डालना होगा। यदि आप इसे कमांड लाइन में परीक्षण करते हैं, तो यह अप्रत्याशित रूप से वापस आ जाएगी %"jump over the "word%%%। बस जागरूक रहें, बैच फ़ाइलों और कमांड लाइन में वह कोड अलग-अलग परिणाम दे सकता है।
दधिी

2
दधीची की हाजिर-जवाबी टिप्पणी के आधार पर, कमांड लाइन के लिए समाधान यहां है: stackoverflow.com/questions/29944902 ……
केबी सेबेस्टा

2
इस उत्तर को आगे बढ़ाते हुए क्योंकि यह दोनों तरह से काम करता है, या तो स्थिति में पर्यावरण चर के साथ, या "पहले" और "बाद" दोनों स्थितियों में: 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%'
टॉम वॉरफील्ड

0

मैं जॉय के उत्तर का उपयोग करने के लिए एक समारोह बनाने में सक्षम था:

इसे इस रूप में उपयोग करें:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

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

GOTO:EOF

और आपके बैच फ़ाइल के नीचे ये कार्य।

: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

और याद रखें कि आपको अपने बैच फ़ाइल के शीर्ष पर "SETLOCAL ENABLEDELAYEDEXPANSION" जोड़ना होगा या फिर इनमें से कोई भी ठीक से काम नहीं करेगा।

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

-4

यह ठीक काम करता है

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

5
क्षमा करें, यह अच्छा लग रहा है, लेकिन यह गलत है! यह शब्द को हटाता है और शब्द chairको जोड़ता है table, लेकिन यह दो शब्दों का आदान-प्रदान नहीं करता है। शब्द को बदलने के लिए प्रयास करें overसाथ underऔर आपको मिलjump the chairunder
जेब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.