vba - 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
解决方案
回答我自己的问题:
经过多次调试,我解决了带空格的路径导致问题。如果我直接输入以下内容(注意引号位置),代码成功运行:
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
推荐阅读
- abap - ABAP 检查交货标题
- python - 如何使用 Pandas 的 date_range 从月初获取每周数据?
- git - 多人安全使用 Git
- labview - LabVIEW: 如何从一个数组复制到另一个数组?
- twitter-bootstrap - Symfony 移动响应式设计
- java - Java XMLStreamReader 将“转换为”
- objective-c - 为什么__block不向数组添加值
- telegram - 如何通过聊天ID查看电报帐户?
- c++ - 使用 FreeType (DirectX 11) 绘制文本
- apache - 需要在 HttpServer 的访问日志中捕获 SSL_PROTOCOL 详细信息