web-dev-qa-db-ja.com

ECHO出力をVBSファイルに書き込んでいない

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

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およびバッチスクリプトを作成するための同様の行がありますが、この方法で問題なく動作すると思います。タイプミスをチェックしましたが、見つかりませんでした。コマンドプロンプトでは問題なく機能しますが、バッチスクリプトでは機能しません。

4
A Child of God

Cmd.exeがバッチスクリプトを解析する方法を理解するのに役立ちます。
パート1-概要
パート2-パーセント拡張の詳細

最初の障害のある回線の処理を実行します。

echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^%USERPROFILE^%^"^) >> uninstallBeta.vbs

フェーズ1のパーセント処理は、フェーズ2の^エスケープ処理の前に発生します。したがって、パーサーはUSERPROFILE^という名前の環境変数を探し、それを見つけることができません。したがって、これは空の文字列に展開され、次のようになります。

echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^^"^) >> uninstallBeta.vbs

次に、フェーズ2でキャレットが処理され、文字がエスケープされます。重要なのは、最初の^"はエスケープされた引用符であるため、後の文字はnot引用。次の^^はエスケープされたキャレットです。エスケープされていない最初の引用符の後に続くので、その後のすべての文字が引用符で囲まれます。引用された各文字の上にQが付いていることを意味します。

                                                        QQQQQQQQQQQQQQQQQQQQQQQ
echo strHomeFolder = oShell.ExpandEnvironmentStrings("^"^) >> uninstallBeta.vbs

>>リダイレクトが機能しない理由は明らかです。引用符で囲まれているため、代わりに文字列リテラルとして機能します。

バッチ内での変数の拡張を防ぐために、%^%としてエスケープしようとしました。それは機能しません。正しいことは、パーセントを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.
6
dbenham

私はこれを試しました、そしてそれも期待通りに動作します.....

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

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

2
TahaEltahawy