การแทนที่สตริงในไฟล์แบตช์


102

เราสามารถแทนที่สตริงในไฟล์แบตช์โดยใช้คำสั่งต่อไปนี้

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

เส้นเหล่านี้ใช้ได้ดีและเปลี่ยนสตริง "กระโดดข้ามเก้าอี้" เป็น "กระโดดข้ามโต๊ะ" ตอนนี้ฉันต้องการแทนที่คำว่า "เก้าอี้" ในสตริงด้วยตัวแปรบางตัวและฉันไม่รู้ว่าจะทำอย่างไร

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

ความคิดใด ๆ ?


เป็นไปได้ที่จะทำซ้ำวิธีการแทนที่สตริงภายในไฟล์ bat ด้วยสตริงพารามิเตอร์บรรทัดคำสั่งซึ่งมีคำตอบที่ไม่เป็นทางการมากขึ้น (มีวิธีแก้ปัญหาเหมือนกับคำตอบที่นี่)
Fr0sT

1
ตอนนี้ไม่สำคัญว่าใครเป็นคนแรก แต่เป็นการดีที่จะเชื่อมโยงคำถามที่เหมือนกันและชี้ไปที่คำตอบที่หักล้างไม่ได้มากที่สุด
Fr0sT

คำตอบ:


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!!ทำงานไม่ถูกต้อง
ImaginaryHuman072889

ฉันเข้าใจ"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 เพียงแค่เพิ่มอักขระอื่นที่ต้องกังวล
Anders

9
ที่สำคัญสิ่งที่เกี่ยวกับคำตอบให้โดยโจอี้ คุณต้องใส่รหัสลงในไฟล์แบตช์เพื่อให้ใช้งานได้ %"jump over the "word%%%หากคุณเพียงแค่ทดสอบในบรรทัดคำสั่งก็จะกลับที่ไม่คาดคิด โปรดทราบว่ารหัสในไฟล์แบตช์และในบรรทัดคำสั่งอาจให้ผลลัพธ์ที่แตกต่างกัน
dadhi

2
อาคาร dadhi ของจุดที่แสดงความคิดเห็นแก้ปัญหาสำหรับบรรทัดคำสั่งที่นี่: stackoverflow.com/questions/29944902/...
Kenn Sebesta

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%'
Tom Warfield

0

ฉันสามารถใช้ Joey's Answer เพื่อสร้างฟังก์ชัน:

ใช้เป็น:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

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

GOTO:EOF

และฟังก์ชั่นเหล่านี้ที่ด้านล่างของ Batch File ของคุณ

: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
jeb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.