バッチファイルの文字列置換


102

次のコマンドを使用して、バッチファイル内の文字列を置き換えることができます

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

これらの行は正常に機能し、文字列「jump over the chair」を「jump over the table」に変更します。ここで、文字列内の「chair」という単語を変数に置き換えたいのですが、その方法がわかりません。

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

何か案は?


バットファイル内の文字列をコマンドラインパラメータ文字列に置き換える方法の重複の可能性があります。これはより非公式な回答です(ただし、ここでの回答と同じ解決策があります)
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!"
BERを

88

次の小さなトリックを使用できます。

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

callそこに、変数展開の別の層を引き起こし、それが必要な元引用すること%兆しをしかし、それはすべての終わりにうまくいきます。


私はこのソリューションが好きです。バッチファイルでは文字列のエスケープが常に問題になります。ENABLEDELAYEDEXPANSIONは、気になる別の文字を追加するだけです。
アンデルス

9
Joeyが提供する回答に関して重要なこと。コードを機能させるには、コードをバッチファイルに入れる必要があります。コマンドラインでテストすると、予期しない結果が返され%"jump over the "word%%%ます。バッチファイル内とコマンドライン内のコードでは、結果が異なる場合があることに注意してください。
ダディ2014

2
dadhiのスポットオンコメントに基づいて構築されたコマンドラインのソリューションは、次のとおりです:stackoverflow.com/questions/29944902/…
ケンセベスタ2017年

2
:それはどちらかの位置にある環境変数を持つ、またはその両方に「前」と位置「後」、両方の方法を動作するため、この答えをUpvoting 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

JoeyのAnswerを使用して関数を作成できました。

次のように使用します。

@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が、2つの単語は交換しません。単語を交換してみoverunder、あなたが得るjump the chairunder
ジェブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.