5

CScript を使用して VBScript ファイルを実行しています。パラメータにスペースと引用符の両方が含まれるコマンド ラインをスクリプトに渡す必要があります。コマンド全体を 1 つのパラメーターとしてスクリプトに渡す必要があります。例えば:

C:\> CScript myscript.vbs //Nologo "cmd.exe /c "dir && del /q *.txt""

上記の特定のコマンド ラインは単なる例ですが、私がやろうとしていること (つまり、cmd.exe の実行を含むコマンド ラインを渡す) に触れていることに注意してください。ただし、一般的なケースを解決しようとしています。

問題は、CScript が引用符の開始と終了の場所を特定しようとして混乱しているように見えることです。少なくとも時々。

次のスクリプトは説明に役立つ場合があります。渡された引数をそのまま出力するだけです。

Dim count
For count = 0 To WScript.Arguments.Count-1
    WScript.Echo CStr(count) & " = " & WScript.Arguments.Item(count)
Next

多くの場合、期待どおりに機能します。

C:\> cscript myscript.vbs //Nologo "1 2 3"
0 = 1 2 3

ただし、引用符で囲まれたパラメーター内に引用符があると、状況が変わります。

C:\> cscript myscript.vbs //Nologo "1 "2 3""
0 = 1 2
1 = 3

上記の例では、各引用符がパラメーターを開いているか閉じているかについてあいまいさが生じていることを理解しています。そのため、次に内部引用符をエスケープして、コマンド プロセッサがそれらをリテラル文字列として扱うようにしました。

C:\> cscript myscript.vbs //Nologo "1 ^"2 3^""
0 = 1 ^2
1 = 3

うーん、シェルがグロビングなどを行う場合にのみ機能するようです。cscript^が cmd.exe のようにエスケープ文字として理解できるとは思えません。

二重引用符で囲まれたコマンド内で単一引用符を使用すると (例: "cmd.exe /c 'dir && cd \'")、単一のパラメーターとして適切に解析されますが、/c パラメーターを指定して cmd.exe を呼び出す場合は機能しません。 、一重引用符では不十分です。例えば:

C:\> cmd /c 'dir && cd \'
''dir' is not recognized as an internal or external command,
operable program or batch file.

スクリプト内のすべての引数を反復処理して、それらを結合して 1 つの長い文字列に戻すことができると思いますが、それを行うと、それらが提供する内部引用符とコンテキストが失われます。または、二重引用符で囲まれたパラメーター内で単一引用符を使用し、スクリプト内でそれらを二重引用符にマップし直すこともできます。しかし、その意図、私が考慮していない将来のケースの一重引用符だったとしたらどうでしょうか? 私は一般的なケースを解決しようとしているので、その決定を下すことはできません。

何か案は?

4

2 に答える 2

4

パラメータの値を線引きしようとしているようです。引用符以外のものを使用して、引用符を追加し直すことをお勧めします。チルダの使用例:

Dim count
For count = 0 To WScript.Arguments.Count-1
    WScript.Echo CStr(count) & " = " & replace(WScript.Arguments.Item(count),"~",chr(34))
Next

通過:

cscript myscript.vbs //Nologo "1 ~2 3~"
0 = 1 "2 3"
于 2012-04-10T15:41:09.277 に答える
0

2 つのオプションがあります。

1 つ目は簡単です。カラット (^) を使用して引用符をエスケープします。

C:\> CScript myscript.vbs //Nologo "cmd.exe /c ^"dir && del /q *.txt^""

2 番目のオプションは、別の区切り文字を使用することです。このようなコマンドでは、シェルはパラメーター間の区切りとしてスペースを使用します。ただし、シェルでは、セミコロン、コンマ、等号、タブなどを使用できます。これらのいずれかを実装すると、スペースがコマンド ラインを壊さなくなるため、パラメータを引用符で囲む必要がなくなります。

于 2012-04-10T23:05:24.780 に答える