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

Wes*_* S. 5 vbscript wsh

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

C:\> CScript myscript.vbs //Nologo "cmd.exe /c "dir && del /q *.txt""
Run Code Online (Sandbox Code Playgroud)

请注意,上面的特定命令行只是一个示例,但它确实涉及我要执行的操作(即传递涉及运行 cmd.exe 的命令行)。但是,我正在尝试解决一般情况。

问题是 CScript 似乎在试图确定引号的开始和结束位置时感到困惑。至少有时候。

以下脚本可能有助于解释。它只是输出传入的参数,因为它看到它们:

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

很多时候,它按预期工作:

C:\> cscript myscript.vbs //Nologo "1 2 3"
0 = 1 2 3
Run Code Online (Sandbox Code Playgroud)

但是当引用参数中有引号时,情况会发生变化:

C:\> cscript myscript.vbs //Nologo "1 "2 3""
0 = 1 2
1 = 3
Run Code Online (Sandbox Code Playgroud)

我知道在上面的示例中每个引号是打开还是关闭参数存在引入歧义,因此接下来我尝试转义内部引号,以便命令处理器将它们视为文字字符串:

C:\> cscript myscript.vbs //Nologo "1 ^"2 3^""
0 = 1 ^2
1 = 3
Run Code Online (Sandbox Code Playgroud)

嗯,看起来这仅在 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.
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

eab*_*ham 4

看来您正在尝试描述参数中的值。我建议使用除引号之外的其他内容并添加回引号。例如使用波浪号:

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

通过:

cscript myscript.vbs //Nologo "1 ~2 3~"
0 = 1 "2 3"
Run Code Online (Sandbox Code Playgroud)