オプションは、環境変数Option1
、Option2
とOption3
の値を処理するための一時ファイルに書き込まれている理由それは私のため不明です。そして、実際の値が割り当てられている環境変数Option1
、Option2
、Option3
を定義する行を見ると良いでしょう。
%20
のようなバッチファイルは、すべてのOption
環境変数のHTMLファイルや電子メールのスペース文字で置き換えてください。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Option1=Calculation%%20One"
set "Option2=Calculation %%%%20Two!"
set "Option3=Any other string"
cls
echo The options before processing:
echo/
set Option
for /F "delims==" %%I in ('set Option 2^>nul') do call :ProcessOption "%%I"
echo/
echo The options after processing:
echo/
set Option
echo/
endlocal
pause
goto :EOF
:ProcessOption
setlocal EnableDelayedExpansion
set "ModifiedOption=!%~1:%%20= !"
endlocal & set "%~1=%ModifiedOption%"
goto :EOF
そうでない場合は、Windowsのコマンド・インタープリターはどこ文字列置換が終了すると、環境変数の参照はわかりませんので、空白文字で%20
の出現をすべて置き換えるに遅れ拡張を使用する必要があります。その理由から、直後の展開を使用して文字列をパーセント記号に置き換えることはできません。
コマンドset Option
出力はアルファベット順に、それは、このバッチファイルを実行する上で二度見られるように、大文字と小文字を区別しない文字列Option
と形式variable=value
内に始まるすべての環境変数をソート。 FOR
は、個別のコマンド処理でこのコマンドをバックグラウンドで起動し、実行STDOUTを処理するために、コマンドSETによって書かれたすべての行をキャプチャします。
ストリング2^>nul
は2>nul
最後に実行され、それを抑制するための装置NULにSTDERRを処理するコマンドSETによりエラーメッセージ出力をリダイレクトされます。 Option
で始まる環境変数がない場合、現在の環境で定義されている場合、SETはエラーメッセージを出力します。このバッチファイルでは、このエラー状態は発生しません。マイクロソフト社の記事Using Command Redirection Operatorsを読んでください。リダイレクト演算子>
は、Windowsのコマンド・インタープリターがバックグラウンドでcmd.exe /c set Option 2>nul
を実行 FORコマンドを実行する前にコマンドラインFOR全体を処理するときにリテラル文字として最初に解釈する^
とここにエスケープする必要があります。 FOR
ラインによってset Option
ラインの捕捉出力を処理し、delims==
で指定されるように区切り文字として等号を使用してサブストリング(トークン)に各ラインアップを分割します。各行で最初に等号に残された文字列は、ループ変数I
に割り当てられます。これは環境変数の名前です。Option1
、Option2
およびOption3
です。
各OptionX
環境変数名の場合は、のすべての値を空白文字で置換するためにサブルーチンProcessOption
が呼び出されます。
変数名に1つ以上の感嘆符が付いた環境変数の解決方法を次に示します。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "!Option1!=Calculation%%%%20One"
set "!Option2!=City%%20Country"
set "!Option3!=State%%%%20Country"
set "!Option4!=Any other address/string"
cls
echo The options before processing:
echo/
set !Option
for /F "delims==" %%I in ('set !Option 2^>nul') do call :ProcessOption "%%I"
echo/
echo The options after processing:
echo/
set !Option
echo/
endlocal
pause
goto :EOF
:ProcessOption
call set "ModifiedOption=%%%~1%%"
setlocal EnableDelayedExpansion
set "ModifiedOption=!ModifiedOption:%%%%20= !"
set "ModifiedOption=!ModifiedOption:%%20= !"
endlocal & set "ModifiedOption=%ModifiedOption%"
set "%~1=%ModifiedOption%"
set "ModifiedOption="
goto :EOF
このバッチコードは名前にOption
で始まる環境変数にスペースでちょうど%20
を置き換える上記と比較して空白文字で名前に!Option
で始まるすべての環境変数で%20
と%%20
を置き換えます。
もちろん、Windowsコマンドインタープリタでは特殊文字の意味を持つ変数名には、&()[]{}^=;!'+,`~|<>%
のような文字を使用することをお勧めします。上記のように可能ですが、間違いなく良い考えです。
使用されているコマンドとその動作方法を理解するには、コマンドプロンプトウィンドウを開き、次のコマンドを実行して、コマンドごとに表示されているすべてのヘルプページをすべてよく読んでください。
call /?
cls /?
echo /?
endlocal /?
for /?
goto /?
set /?
setlocal /?
&
オペレータの説明については、Single line with multiple commands using Windows batch fileの回答も参照してください。
そして、のecho/
の代わりにecho
を使用することをお勧めします。空行を出力します。
バッチファイルでは、標準はエスケープ文字として倍率を指定するので、スクリプトを '%%%% 20'に変更してもう一度試してみてください。 – Compo