2017-09-26 3 views
0

"Calculation %% 20One"のような文字列の一部である%% 20を置き換えるユースケースがあります。私はこれを「計算1」に置き換えたいと思う。Windowsバッチスクリプトを使用して%% 20を文字列に置き換えます。

私は立ち往生していますここ:

@echo off 
setlocal enableextensions disabledelayedexpansion 

>"temp" (
    echo !Option1! 
    echo !Option2! 
    echo !Option3! 
) 

set "pattern=%%20" 

for /f "usebackq delims=" %%a in ("temp") do (
    echo data: %%a 

    set "line=%%a" 
    setlocal enabledelayedexpansion 
    if "!line:%pattern%=!"=="!line!" (
     set string=!Option1! 
     set string2=%!string1!:%%20= % 
    ) else (
     set string2=%%a 
    ) 
    endlocal 
) 

del /q tempFile 

は、誰かがこれで私を助けてくださいことはできますか?私は、バッチとPythonを組み合わせたプログラムを持っています。

おかげ

+0

バッチファイルでは、標準はエスケープ文字として倍率を指定するので、スクリプトを '%%%% 20'に変更してもう一度試してみてください。 – Compo

答えて

0

オプションは、環境変数Option1Option2Option3の値を処理するための一時ファイルに書き込まれている理由それは私のため不明です。そして、実際の値が割り当てられている環境変数Option1Option2Option3を定義する行を見ると良いでしょう。

%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^>nul2>nul最後に実行され、それを抑制するための装置NULSTDERRを処理するコマンドSETによりエラーメッセージ出力をリダイレクトされます。 Optionで始まる環境変数がない場合、現在の環境で定義されている場合、SETはエラーメッセージを出力します。このバッチファイルでは、このエラー状態は発生しません。マイクロソフト社の記事Using Command Redirection Operatorsを読んでください。リダイレクト演算子>は、Windowsのコマンド・インタープリターがバックグラウンドでcmd.exe /c set Option 2>nulを実行 FORコマンドを実行する前にコマンドラインFOR全体を処理するときにリテラル文字として最初に解釈する^とここにエスケープする必要があります。 FOR

ラインによってset Optionラインの捕捉出力を処理し、delims==で指定されるように区切り文字として等号を使用してサブストリング(トークン)に各ラインアップを分割します。各行で最初に等号に残された文字列は、ループ変数Iに割り当てられます。これは環境変数の名前です。Option1Option2および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を使用することをお勧めします。空行を出力します。

関連する問題