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

问题描述 投票:0回答:2

我有一个批处理脚本:

测试.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

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

windows batch-file vbscript dos
2个回答
4
投票

实现此功能的方法是:

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

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

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

所有功劳归功于Alex K,来自评论。

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


0
投票

您可以简单地在参数周围使用单引号,嵌套在典型的非转义双引号内,而不是混淆双引号的重复(无论出于何种原因在我的场景中不起作用)。

示例:(在本例中使用 WshShell.Run)

Set WshShell = CreateObject("WScript.Shell")
strCommand = "Email_Alerts.bat '" & warningSubj & "' '" & warningMsg & "'"
Call WshShell.Run(strCommand, 1, True)
© www.soinside.com 2019 - 2024. All rights reserved.