VBSファイルへのECHO出力の書き込みが機能しない


4

各行をエコーし​​、作成されたファイルに出力を向けることにより、VBスクリプトを作成するバッチスクリプトを作成しています。コマンドライン変数を取得してVBS変数として使用する2行を除いて、ほとんどの部分で機能します。これはコードです:

ECHO:strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^%USERPROFILE^%^"^) >> uninstallBeta.vbs
ECHO:strProgramData = oShell.ExpandEnvironmentStrings^(^"^%ProgramData^%^"^) >> uninstallBeta.vbs

VBスクリプトでは次のようになります。

strHomeFolder = oShell.ExpandEnvironmentStrings("%USERPROFILE%")
strProgramData = oShell.ExpandEnvironmentStrings("%ProgramData%")

しかし、バッチスクリプトは、を含む行全体をエコーするだけ>> uninstallBeta.vbsです。なぜこれが起こるのか?他のVBSおよびバッチスクリプトを作成するための同様の行があり、この方法でうまく機能すると思います。タイプミスをチェックしましたが、見つかりませんでした。コマンドプロンプトでは正常に機能しますが、バッチスクリプトでは機能しません。


私はそれを修正する解決策を発見しましたが、なぜこれが起こったのかを知りたいです。
神の子

あなたは見たいかもしれませんstackoverflow.com/a/9074483/1012053、特にUPDATE 2014年4月27日、完全に独立したVBSファイルを作成しないようにする方法のために、下部のセクション。実際にバッチスクリプト内で直接VBSを実行できます!
-dbenham

@dbenham昨日、誰かが答える前にそれを見た。それを試してみてください。
神の子

回答:


7

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.

@Facebook-あなたがどのような状況を指しているのかわかりません。具体例を見る必要があります。面倒なシナリオを正確に把握したら、ここまたはStackOverflowに新しい質問を投稿してください。
-dbenham


2

私はこれを試してみましたが、期待通りに動作します。

set a=userprofile
set b=ProgramData
> uninstallBeta.vbs ECHO strHomeFolder = oShell.ExpandEnvironmentStrings^("%%%a%%%%"^)
>> %DESKTOP%\uninstallBeta.vbs ECHO strProgramData = oShell.ExpandEnvironmentStrings^("%%%b%%%%"^)

私はバッチスクリプトの初心者でもあり、試してみてこれが機能していることがわかりました。誰かがそれがどのように機能するかを説明することを望みます。


それが機能する理由については、dbenhamの回答を参照してください。
神の子
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.