如何将带空格和引号的命令作为单个参数传递给CScript?

时间:2012-04-10 15:30:59

标签: vbscript wsh

我正在使用CScript运行VBScript文件,我需要将命令行传递给脚本,其中参数包含空格和引号。整个命令需要作为一个参数传递给脚本。例如:

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

嗯,看起来只有当shell执行你的全局操作时才有效。我怀疑cscript将^理解为像cmd.exe那样的转义字符。

在双引号命令中使用单引号(例如“cmd.exe / c'dir&& cd \'”)正确解析为单个参数但由于调用cmd的情况不起作用。使用/ c参数的exe,单引号是不够的。例如:

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

我想我可以迭代脚本中的所有参数并将它们连接回一个长字符串,但是我会丢失它们提供的内部引号和上下文。或者我可能在双引号参数中使用单引号并将它们映射回脚本内的双引号。但是,如果意图 单引号用于未来的某些案例我不会考虑怎么办?由于我试图解决一般情况,我无法做出这样的决定。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您似乎试图在参数中描绘值。我建议使用除引号之外的内容并添加引号。例如使用波浪号:

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"

答案 1 :(得分:0)

您有两种选择。

第一个很容易 - 使用克拉(^)来逃避引号。

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

第二个选项是使用不同的分隔符。在这样的命令中,shell使用空格作为参数之间的分隔符。但是shell允许其他人使用分号,逗号,等号和制表符。通过实现其中一个,您不需要用引号括起参数,因为空格不会再破坏您的命令行。