cmd.exeがバッチスクリプトを解析する方法を理解するのに役立ちます:
パート1-概要
パート2-拡張の詳細のパーセント
最初の障害のある行の処理を実行します。
echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^%USERPROFILE^%^"^) >> uninstallBeta.vbs
フェーズ1のパーセント処理は^
、フェーズ2のエスケープ処理の前に発生します。したがって、パーサーは、という名前の環境変数USERPROFILE^
を探し、それを見つけることができません。したがって、空の文字列に展開され、次のようになります。
echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^^"^) >> uninstallBeta.vbs
次に、フェーズ2でキャレットを処理して文字をエスケープします。重要なことは、最初^"
は引用符がエスケープされているため、その後の文字は引用符で囲まれないことです。次^^
はエスケープされたキャレットです。エスケープされない最初の引用符の後に続くため、その後のすべての文字は引用符で囲まれます。引用符で囲まれた各文字の上にQがあることを意味します。
QQQQQQQQQQQQQQQQQQQQQQQ
echo strHomeFolder = oShell.ExpandEnvironmentStrings("^"^) >> uninstallBeta.vbs
>>
リダイレクトが機能しない理由は明らかです。引用符で囲まれているため、代わりに文字列リテラルとして機能します。
バッチ内の変数の展開を防ぐために%
as をエスケープしようとしました^%
。それは機能しません。正しいことは、パーセントを2倍にすることです。
echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%") >> uninstallBeta.vbs
行が括弧で囲まれたブロック内にある場合は、エスケープする必要があります)
が、(
エスケープする必要はないだろう
for .... do (
...
echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%"^) >> uninstallBeta.vbs
...
)
ルールはコマンドラインとは異なることに注意してください。%
コマンドライン内でを本当にエスケープするメカニズム%undefinedVar%
はありません。変数が未定義の場合、コマンドラインはテキストを保持します。ただし、^
パーセントの間に1つ以上を含めて変数が見つからないようにすることで、変数の拡張を効果的に防ぐことができます。次に、フェーズ2でキャレットが消えます。ただし、内部が^
消えるように、最初の引用符をエスケープする必要があります。また、リダイレクトがアクティブになるように、最後の引用符をエスケープする必要があります。
これはコマンドラインから機能します(ただし、バッチスクリプト内では機能しません)。
echo strHomeFolder = oShell.ExpandEnvironmentStrings(^"%USERPROFILE^%^") >> uninstallBeta.vbs
キャレットは、パーセントの間のどこにでも表示できます。次のすべてが同様に機能します。
%USER^PROFILE%
%^USERPROFILE%
etc.