如果路径中包含空格,则无法从VBScript启动bat文件

4

我一直在尝试从路径中启动myFileToRun.bat文件,例如:


D:\My Folder\batchfiles\myFileToRun.bat

以下是我尝试运行它的VBScript代码。
Dim WshShell, strCurrentDirectory  
Set WshShell = CreateObject("WScript.Shell")  
strCurrentDirectory    = WshShell.CurrentDirectory  
WshShell.Run strCurrentDirectory & "\myFileToRun.bat" , 0  
Set WshShell = Nothing

我无法运行它,因为VBS会抛出错误,说“找不到指定的文件”。 我尝试了在stackoverflow和其他论坛中提到的各种方法。大多数方法都建议添加双引号。

注意:我已经尝试添加双引号、双倍双引号等。

1.WshShell.Run """strCurrentDirectory & "\myFileToRun.bat" "", 0
2.WshShell.Run """"strCurrentDirectory & "\myFileToRun.bat"""", 0
3.WshShell.Run """"strCurrentDirectory & \myFileToRun.bat"""", 0

没有一个方法奏效,我猜可能是我在错误的位置使用了引号。变量strCurrentDirectory会变成"strCurrentDirectory"而不是"D:\My Folder\batchfiles",因此我的最终路径会变成"strCurrentDirectory""\myFileToRun.bat",这是不正确的。我需要路径为"D:\My Folder\batchfiles\myFileToRun.bat"并运行该文件。
我还没有真正理解添加引号的概念。所以你能否请解释一下这个概念,并帮助我解决这个错误。
编辑:我已经找到了解决方案。由于我必须引用当前目录,所以我只需简化脚本即可。
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "myFileToRun.bat", 0
Set WshShell = Nothing

感谢大家的回答,对我很有帮助。

可能是vbscript error on run command with long argument的重复问题。 - user692942
你只需要转义想要作为参数的任何引号,方法是将它们加倍""。你之前尝试失败是因为忘记连接字符串(这就是变量strCurrentDirectory被作为字符串一部分而不是它的值被添加的原因),请尝试这个- WshShell.Run """" & strCurrentDirectory & "\myFileToRun.bat""", 0 - user692942
4个回答

2

尝试这样做:

Dim WshShell, strCurrentDirectory  
Set WshShell = CreateObject("WScript.Shell")  
strCurrentDirectory    = WshShell.CurrentDirectory  
WshShell.Run """" & strCurrentDirectory & "\di r\myFileToRun.bat" & """" , 0  
Set WshShell = Nothing

2
结尾的 & """" 是什么意思?不需要在那里进行连接,只需执行 WshShell.Run """" & strCurrentDirectory & "\dir\myFileToRun.bat""", 0 - user692942
1
无论是 & """" 还是 """,最终都只是一个字符串,没有任何区别。 - user692942
2
@Lankymart - 啊,没错。如果批处理文件名设置为变量,最终可能会被使用。 - npocmaka
这确实是真的。 - user692942
@npocmaka,它现在运行良好,错误已经消失了。感谢您的时间。谢谢。 - Vikas Vicky

2
你只需正确转义字符串中的引号,规则是每当你想在字符串中显示引号时,需要将其双倍。

因此,这个命令

WshShell.Run strCurrentDirectory & "\myFileToRun.bat" , 0

此刻将作为参数传递;

D:\My Folder\batchfiles\myFileToRun.bat

大多数 Windows 程序都需要用引号括起来的路径才能被正确识别,特别是当路径中含有空格时。目前,Run() 函数无法正确处理这种情况。

D:\My

将其余部分作为参数传递给My程序。由于系统找不到My程序,这将导致

系统找不到指定的文件

错误。

为了解决这个问题,我们需要传递一个带引号的字符串(对于每个要包含的文字引号,需要将引号加倍)

WshShell.Run """" & strCurrentDirectory & "\myFileToRun.bat""", 0

将传递如下:

"D:\My Folder\batchfiles\myFileToRun.bat"

注意:在与变量连接时,我们仍然需要正确地打开和关闭字符串。对于像上面这样的情况,我们将字符串""""连接到一个变量上,这只是一个具有开头和结尾引号来表示字面字符串的""

此外,变量需要正确地连接到字符串中,否则您将得到奇怪的结果,例如您第一次尝试转义字符串时。

WshShell.Run """strCurrentDirectory & "\myFileToRun.bat" "", 0

会引起的问题;

预期语句结束

因为它不是正确终止的字符串。


1
非常感谢您如此详细地解释。我已经清楚地理解了。 - Vikas Vicky
@VikasVicky 没问题,很高兴能帮忙。 - user692942

1
你可以使用这个函数将双引号添加到变量中:
Function DblQuote(Str)
    DblQuote = Chr(34) & Str & Chr(34)
End Function

所以,代码变得易于阅读:

Dim WshShell, strCurrentDirectory  
Set WshShell = CreateObject("WScript.Shell")  
strCurrentDirectory = WshShell.CurrentDirectory  
wscript.echo DblQuote(strCurrentDirectory & "\My Folder\myFileToRun.bat")
WshShell.Run DblQuote(strCurrentDirectory & "\My Folder\myFileToRun.bat"),0 
Set WshShell = Nothing
'********************************************************************
Function DblQuote(Str)
    DblQuote = Chr(34) & Str & Chr(34)
End Function
'********************************************************************

我已经尝试过了,但仍会抛出错误,因为strCurrentDirectory将被视为文字,路径将变成"strCurrentDirectory"\myFileToRun.bat。 - Vikas Vicky
这样行不通,因为 DblQuote() 函数需要变成 DblQuote = Chr(34) & Chr(34) & Str & Chr(34) & Chr(34),你没有将引号加倍。 - user692942
@VikasVicky 当您执行以下代码时:wscript.echo DblQuote(strCurrentDirectory & "\My Folder\myFileToRun.bat") 您得到了什么结果? - Hackoo
@Lankymart,实际上DblQuote()函数可以在没有双重引号的情况下正常工作。 - Vikas Vicky
@Hackoo 我猜我没有正确地调用函数。现在它运行得很好。谢谢您。它以 "D:\My Folder\batchfiles\myFileToRun.bat" 的形式正确显示了路径。 - Vikas Vicky
@VikasVicky 啊,是的,我刚刚测试了一下,因为它使用 Chr(34) 方法来定义 ASCII 字符,所以不会干扰字符串的定义。 - user692942

-2
尝试了上述所有方法,对于在Windows 7 PC上正常工作但在Windows 10 PC上失败得很惨的VBScript文件都进行了尝试。 VBScript可以接受字符串中的空格,但在"run"方法中不行。 包含以下行的脚本将会失败:
wss = WScript.CreateObject("WScript.Shell")
wss.run = "C:\Program Files\xxx.exe"
在这种情况下,解决方案很简单: 你需要定义一个指向xxx的链接,xxx.lnk,并将其存储在路径中没有空格的文件夹中,例如
C:\Users\Links
然后在VBScript中使用:
wss.run = "C:\Users\Links\xxx.lnk"
这样就可以正常工作了,但对于一些更复杂的VBScripts来说,需要进行大量的改写。真是遗憾。 一个bug就是一个bug。

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