首页 > 解决方案 > WScript.Shell 因未知原因 VB6.5 失败

问题描述

在 VBA 中,我正在运行我编写的一个外部软件。我知道该软件运行良好。我可以从命令行运行它。但是当我尝试使用 WScript.Shell.Run 执行它时,它返回一个 1 并且它永远不会运行。我什至无法判断它是否执行该软件。

这是 VBA 类的执行部分。

Public Function Execute() As Integer
    Dim wsh As Object
    Dim waitOnReturn As Boolean: waitOnReturn = True
    Dim windowStyle As Integer: windowStyle = 1
    Dim exitCode As Integer: exitCode = -1

    Set wsh = VBA.CreateObject("WScript.Shell")

    'Run program with arguments and wait for the program to finish 
    If Me.PrinterType = 1 Then exitCode = wsh.Run(Me.Path & " /serial=" & Me.SerialNumber & " /position=" & Me.Location & "", windowStyle, waitOnReturn)
    If Me.PrinterType = 2 Then exitCode = wsh.Run(Me.Path & " /boxid=" & Me.Location & " /version=" & Me.Version, windowStyle, waitOnReturn)
    Execute = exitCode

End Function

完整执行字符串的示例:

C:.path.to.\PrintLabel.exe /serial=EOSJ61110044 /position=2

证明脚本在 VBA 正在执行的同一台机器上运行没有错误的证据: 在此处输入图像描述

所以我不知道发生了什么。

我可以成功使用以下VBA Shell 函数

If Me.PrinterType = 1 Then exitCode = Shell(Me.Path & " /serial=" & Me.SerialNumber & " /position=" & Me.Location, vbHide)

但是问题就变成了 VBA 在继续之前不会等待软件完成。所以我需要继续努力WScript.Shell工作。我错过了什么?是否有任何我可能遗漏的需要启用的特定参考?

更新1:

试过这个来模仿这个 SO 帖子,但仍然没有成功:

If Me.PrinterType = 1 Then fullExecutionString = Me.Path & " /serial=" & Me.SerialNumber & " /position=" & Me.Location
If Me.PrinterType = 2 Then fullExecutionString = Me.Path & " /boxid=" & Me.Location & " /version=" & Me.Version
wsh.Run fullExecutionString, windowStyle, waitOnReturn

更新 2:制作了一个在 windows cmd 控制台中重复该过程的小方法。它(或多或少)使用相同的代码。我猜它与带有参数的命令路径字符串有关?

Private Sub Button2_Released()
    Dim wsh As Object
    Dim waitOnReturn As Boolean: waitOnReturn = True
    Dim windowStyle As Integer: windowStyle = 1
    Dim exitCode As Integer: exitCode = 0
    Set wsh = VBA.CreateObject("WScript.Shell")
    exitCode = wsh.Run("C:\Windows\System32\cmd.exe", windowStyle, waitOnReturn)
End Sub

标签: vba

解决方案


回答我自己的问题:

经过多次调试,我解决了带空格的路径导致问题。如果我直接输入以下内容(注意引号位置),代码成功运行:

exitCode = wsh.Run("""C:\path.to\PrintLabel.exe"" /serial=EOSJ61110044 /position=2", windowStyle, waitOnReturn)

所以最后我调整了我的Path财产:

Public Property Let Path(ByVal NewValue As String)
   actPath = Chr(34) & NewValue & Chr(34)
End Property
Public Property Get Path() As String
    Path = actPath
End Property

推荐阅读