如何在vbs中传递包含空格的参数

3

I have a batch script:

test.bat

echo first arg is %1
pause

我想从一个带有管理员权限的VBScript中调用:

test.vbs

Set UAC = CreateObject("Shell.Application")
UAC.ShellExecute "test.bat", "argument", "", "runas", 1

这段代码本身没问题,但是我不能将包含空格的路径参数作为单个参数传递。基本上,我需要在空格中括起来,但无论我尝试什么,都不起作用。它看起来调用了批处理文件,但是命令窗口只是一闪而过,我不知道出了什么问题。
我尝试了以下方法:

UAC.ShellExecute "test.bat", """has spaces""", "", "runas", 1

并且

UAC.ShellExecute "test.bat", Chr(34) & "has spaces" & Chr(34), "", "runas", 1

并且

UAC.ShellExecute "test.bat", '"has spaces"', , "runas", 1

并且

UAC.ShellExecute "cmd", "/c test.bat " & chr(34) & "has spaces" & chr(34), "", "runas", 1

但是没有运气。有什么建议我做错了吗?

不确定为什么那个不起作用,但这个应该可以;UAC.ShellExecute "cmd", "/c test.bat " & chr(34) & "has spaces" & chr(34), "", "runas", 1 - Alex K.
4
奇怪,如果我传递完整路径“/c c:\temp\test.bat”,它对我有效。 - Alex K.
啊,我也是,谢谢!不过很奇怪,需要进一步调查... - matt burns
传递cmd参数"/k test.bat"(/k保持窗口打开)向我展示它正在运行在\windows\system32中,这就是为什么批处理脚本找不到的原因。 - matt burns
啊,这很有道理,也许是因为“runas”命令导致它忽略了执行用户的当前目录。 - Alex K.
@AlexK.: https://gist.github.com/3f66e47a56368155f920chr(34) 技巧对我不起作用。 - prongs
1个回答

4

让这个工作的方法是:

UAC.ShellExecute "cmd", "/c """"c:\test.bat"" ""has spaces""""", "", "runas", 1

使用runas调用管理员用户权限时需要注意的重要事项是,工作目录将更改为c:\windows\system32。因此,您需要指定批处理文件的完整路径以便找到它。

我仍然不确定为什么只有在将bat文件作为参数传递给“cmd”时才起作用,而不是直接执行它。

所有功劳归Alex K评论。

在这种情况下,您需要引用cmd的整个参数集以及每个参数。您还需要加倍引号。看起来有点疯狂,但这是最好的解决方案,否则如果任何参数和bat文件路径中有空格,则会失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接