如何通过用空格和引号作为一个参数为Cscript命令?(How to pass a command

2019-06-23 12:26发布

我使用的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 \’”)正确分析为单个参数,但不会与/ c参数调用CMD.EXE的情况,因为工作,单引号是不够的。 例如:

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

我想我可以遍历脚本中的所有参数和他们一起回一个长字符串,但我会失去内部引号和上下文他们提供这样做。 或者,也许我不使用双引号里面PARAM单引号和映射那些回脚本中的双引号。 但是,如果意图单引号,我不考虑未来的一些情况? 因为我试图解决一般情况下,我不能确定这一点。

有任何想法吗?

Answer 1:

它看起来像你想在你的参数来描绘值。 我建议用引号之外的东西,并重新添加引号。 例如使用波浪号:

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"


Answer 2:

你有两个选择。

第一个是很容易 - 逃避使用克拉(^)的报价。

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

第二个选择是使用不同的分隔符。 在这样的命令时,外壳程序使用的空间作为参数之间的分隔符。 但外壳允许其他人一样分号,逗号,等号,和标签。 通过实施这些中的一个,你就不需要用引号括参数,因为空间将不再打断你的命令行。



文章来源: How to pass a command with spaces and quotes as a single parameter to CScript?
标签: vbscript wsh