2012-04-10 13 views
2

私はVBScriptファイルを実行するのにCScriptを使用しています。パラメータにスペースと引用符の両方が含まれているスクリプトにコマンドラインを渡す必要があります。コマンド全体を1つのパラメータとしてスクリプトに渡す必要があります。例えば:(すなわち、CMD.EXEを実行する必要のコマンドラインを渡す)スペースと引用符を含むコマンドを単一のパラメータとしてCScriptに渡すにはどうすればよいですか?

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

注特定のコマンドラインは、上記の一例であり、それは私が何をしようとしている上でのタッチを行います。しかし、私は一般的なケースを解決しようとしています。

問題は、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 

上記の例で各引用符がパラメータを開いているのか閉じているのかについてあいまいさがありますので、次に内部引用符をエスケープしてみましたので、 dプロセッサはリテラル文字列として扱います:

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

Hmmmは、シェルがあなたのグロビングなどを行うときにのみ動作します。私はcscriptがcmd.exeのようにエスケープ文字として^を理解しているとは思わない。

二重引用符で囲まれたコマンド(例: "cmd.exe/c 'dir & & cd \'")内の単一引用符を使用すると、単一のパラメータとして正しく解析されますが、cmd.exe/cパラメータでは、一重引用符では不十分です。たとえば:

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

私はちょうど超えるスクリプト内のすべての引数を反復処理し、バック1つの長い文字列にそれらを結合するが、私は、彼らがそれをやって提供内部引用符とコンテキストを失う可能性があるとします。あるいは、二重引用符で囲まれたparamの中で一重引用符を使用し、それらをスクリプト内の二重引用符にマップすることもできます。しかし、意図がだった場合、私は考慮していないいくつかの将来のケースのための単一引用符でしたか?私は一般的なケースを解決しようとしているので、私はその決定をすることはできません。

アイデア?

+0

このSOの質問を見てください:[VBScript引数の二重引用符](http://stackoverflow.com/questions/4192376/double-quotes-in-vbscript-argument)多分いくつかの有用な答えがあります。 –

+0

ありがとうございます。私は見てみましょう。 WMIからコマンドラインを取得するだけでもうまくいくかもしれません。 –

答えて

2

パラメータの値の輪郭を描こうとしているようです。引用符以外に何かを使用して引用符を追加することをお勧めします。

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" 
+0

私はこのような解決策を持って行きました。 –

0

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

最初は簡単です。カラット(^)を使用して引用符をエスケープしてください。

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

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

関連する問題