excel - 无法让 WSCript.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'的方法'运行'失败”。
我究竟做错了什么?
解决方案
您必须通过用双引号括起来来转义路径(应用程序和文件)中的空格,因为命令行将它们用作参数分隔符。那会让
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
推荐阅读
- python-3.x - 有效使用多个 Asyncio 队列
- flutter - 如何制作一个有 3 个形状的盒子并排颤动的 Tab 小部件?
- powershell - PowerShell:如何设置文化?
- javascript - 全局 API 调用 Vue.js
- ansible - Ansible 剧本问题
- javascript - POST 405 Ajax(不允许的方法)
- angular - 我正在进行 http get 调用以获取图像 url 状态是否正常,但它给出了错误?
- flutter - 以编程方式构建技术图纸
- java - 如何将随机数转换为字符
- css - SCSS Webfont (Font Awesome) 使用 Webpack 编译损坏