3

我有一个批处理脚本:

测试.bat

echo first arg is %1
pause

我想从具有管理员权限的 vbscript 调用,如下所示:

测试.vbs

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

这工作正常,但我无法传递包含空格作为单个参数的路径参数。基本上,我需要将参数括在空格中,但无论我尝试什么,它都不起作用。看起来它调用了批处理,但是 cmd 窗口只是闪烁并消失了,所以我不知道出了什么问题。我试过了:

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

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

4

1 回答 1

4

让这个工作的方法是:

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

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

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

所有功劳归功于Alex K,所以如果这对您有帮助,请支持他的评论。

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

于 2012-11-16T12:17:25.900 回答