首页 > 解决方案 > 无法让 WSC​​ript.Shell 对象的 Run 方法工作

问题描述

我设置了以下测试程序。

Private Sub TryPDF()
    
    Dim oShell          As Object
    Dim App             As String
    Dim SrcPath         As String
    Dim Fn              As String

    App = "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe "
    SrcPath = Environ("UserProfile") & "\Downloads\"
    Fn = "20200509_Order_of_08_05_2020.PDF"

    Shell App & SrcPath & Fn, vbNormalFocus             ' opens the file
    
    Set oShell = CreateObject("WSCript.Shell")
    oShell.Run App & SrcPath & Fn, vbNormalFocus, True  ' error -2147024894
    Set oShell = Nothing
End Sub

中间的 Shell 命令起作用,从而证明应用程序和文件存在于指定位置。但是,我想要对象的Wait属性,WSCript.Shell因此想使用oShell.Run App & SrcPath & Fn, vbNormalFocus, True. 我已经如图所示对其进行了测试,并且没有任何参数,它应该在完全剥离时打开 Acrobat Reader,并且我总是得到相同的错误,“对象'IWshShell3'的方法'运行'失败”。

我究竟做错了什么?

标签: excelvbashell

解决方案


您必须通过用双引号括起来来转义路径(应用程序和文件)中的空格,因为命令行将它们用作参数分隔符。那会让

C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe

C.\Program位于 C: 上的名为 Program 的文件不存在!

"C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"

将在命令行上按预期工作。

由于某些原因,VBA.Shell可以处理 apppath 中的空格,但WScript.Shell不能。如果它们包含空格,则两者都将在未引用的文件路径上失败。

我喜欢的引用风格是Chr(34)函数

CommanQuoted = Chr(34) & "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" & Chr(34) & " " & Chr(34) 
 & "...\Downloads\20200509_Order_of_08_05_2020.PDF" & Chr(34)

因为它比同样可用的双双引号更具可读性

CommandQuoted = """C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"" ""...\Downloads\20200509_Order_of_08_05_2020.PDF""" 

或者您可以创建一个返回双引号的常量

Const dquote As String = """"
CommandQuoted = dquote & "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" & dquote & " " & dquote 
 & "...\Downloads\20200509_Order_of_08_05_2020.PDF" & dquote
Private Sub OpenPDFWithWScripShell()
    Dim oShell          As Object
    Dim AppPathQuoted   As String
    Dim SrcPathQuoted   As String
    Dim FileName        As String
    Dim shellCommand As String
    AppPathQuoted = Chr(34) & "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" & Chr(34)
    FileName = "20200509_Order_of_08_05_2020.PDF"
    SrcPathQuoted = Chr(34) & Environ("UserProfile") & "\Downloads\" & FileName & Chr(34)
    shellCommand = AppPathQuoted & " " & SrcPathQuoted
    Debug.Print shellCommand
    
    Set oShell = CreateObject("WSCript.Shell")
    oShell.Run shellCommand, vbNormalFocus, True
    Set oShell = Nothing
End Sub

推荐阅读