私が作成したバッチ スクリプトでは、ユーザー入力を確認し、それに応じて IF ステートメントに基づいて機能を実行する場合があります。ユーザー入力が一致しない場合は、再度入力を求められます。私が遭遇している問題は、ユーザーがスペース、<、>、; などを入力すると、プログラムが突然終了することです。if ステートメントを追加してそれらをキャッチし、@ECHO ON を追加してインタラクションを確認しようとしましたが、ユーザーが Enter キーを押すと終了するようです。これを回避する方法についてのアイデアはありますか?
2 に答える
CMD には、特別な意味を持つ多くの文字があり、バッチ パーサーにさらされると多くの望ましくない影響を引き起こす可能性があるため、「有害な文字」と呼ばれることがよくあります。例としては、&
|
>
<
他にもあります。
">"
一般に、 のように引用されているか、 のようにエスケープされている場合、文字は問題を引き起こしません^>
。ただし、ユーザーが入力する内容を制御することはできません。一部の値は、通常の展開を使用して作業するのが安全ではありません。たとえば、ユーザーが を入力This & that "& the other thing"
した場合、値の前後に引用符を追加して両方&
を引用する方法はありません。
ありがたいことに、遅延展開は簡単な解決策を提供します。を使用して変数を展開する代わりに%VAR%
、 を使用します!VAR!
。変数は、パーサーがすべての文字を調べ終わった後に展開されるため、有害な文字は問題になりません。遅延拡張は、最初に次を使用して有効にする必要がありますsetlocal enableDelayedExpansion
これは、どのような有害な文字が存在するかに関係なく、ユーザーが入力した値を正常に ECHO する簡単なデモです。コードを IF ステートメントに簡単に適合させることができます。
@echo off
setlocal enableDelayedExpansion
set /p "var=Enter a string: "
echo You entered: !var!