Penggantian string dalam file batch


102

Kita dapat mengganti string dalam file batch menggunakan perintah berikut

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

Garis-garis ini bekerja dengan baik dan mengubah string "melompati kursi" menjadi "melompati meja". Sekarang saya ingin mengganti kata "kursi" dalam string dengan beberapa variabel dan saya tidak tahu bagaimana melakukannya.

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

Ada ide?


kemungkinan duplikat dari cara mengganti string di dalam file bat dengan string parameter baris perintah yang memiliki jawaban yang jauh lebih informal (ini memiliki solusi yang sama dengan jawaban di sini)
Fr0sT

1
Sekarang tidak penting siapa yang pertama, tetapi ada baiknya untuk menghubungkan pertanyaan yang identik dan menunjuk ke jawaban yang paling tidak dapat
diganggu gugat

Jawaban:


79

Anda dapat menggunakan!, Tetapi Anda harus menyetel sakelar ENABLEDELAYEDEXPANSION.

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

4
Tetapi bagaimana jika stritu sendiri berasal dari ekspansi yang tertunda? set str=!str:chair=!word!!tidak bekerja dengan benar.
ImaginaryHuman072889

Saya mengerti "jump over the !word!".
bers

88

Anda bisa menggunakan sedikit trik berikut:

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

Itu callmenyebabkan lapisan lain dari ekspansi variabel, sehingga perlu untuk mengutip %tanda asli tetapi semuanya berhasil pada akhirnya.


Saya suka solusi ini, melarikan diri string selalu bermasalah dalam file batch, ENABLEDELAYEDEXPANSION hanya menambahkan karakter lain yang perlu dikhawatirkan.
Anders

9
Hal penting terkait jawaban yang diberikan oleh Joey . Bahwa Anda perlu memasukkan kode ke dalam file batch agar dapat berfungsi. Jika Anda hanya mengujinya di baris perintah, itu akan kembali tidak terduga %"jump over the "word%%%. Perlu diketahui, bahwa kode dalam file batch dan baris perintah dapat menghasilkan hasil yang berbeda.
dadhi

2
Berdasarkan komentar dadhi, solusi untuk baris perintah ada di sini: stackoverflow.com/questions/29944902/… .
Kenn Sebesta

2
Memberi suara positif pada jawaban ini karena berfungsi dua arah, dengan variabel lingkungan di salah satu posisi, atau di kedua posisi "sebelum" dan "setelah": 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

Saya bisa menggunakan Joey's Answer untuk membuat fungsi:

Gunakan sebagai:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

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

GOTO:EOF

Dan Fungsi ini ke bagian bawah File Batch Anda.

: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

Dan ingat Anda HARUS menambahkan "SETLOCAL ENABLEDELAYEDEXPANSION" ke bagian atas file batch Anda atau semua ini tidak akan bekerja dengan benar.

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

-4

Ini bekerja dengan baik

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

5
Maaf, kelihatannya bagus, TAPI salah! Ini menghapus kata chairdan menambahkan kata table, tetapi tidak menukar dua kata. Cobalah untuk mengganti kata overdengan underdan Anda mendapatkanjump the chairunder
jeb
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.