Shell命令未执行

时间:2019-04-16 16:45:31

标签: vba shell

我想编写一个宏,使用shell命令打开一些外部应用程序,等待确切的时间,然后关闭该应用程序,然后从命令行打开new,我的问题是shell命令执行后代码无法执行Taskkill。我检查了是否可以在调试模式下运行宏,是否有人知道哪里出了问题?

Retval = Shell("C:\Program Files\ANSYS Inc\ANSYS Student\v192\Framework\bin\Win64\runwb2.exe -I -R C:\Users\Pavel\Documents\Ansys_import\basic_1.wbjn")

Application.Wait (Now + TimeValue("00:02:00"))
Retval = Shell("taskkill /f /im AnsysFww.exe")
newpar = Shell("C:\Program Files\ANSYS Inc\ANSYS Student\v192\Framework\bin\Win64\runwb2.exe -I -R C:\Users\MARCIN\Documents\Ansys_import\basic_2.wbjn")

1 个答案:

答案 0 :(得分:2)

围绕系统的边缘和接缝进行调试总是很简单的,这就是这里发生的事情:就VBA而言,代码没有什么错,除了如果您以后不打算使用该函数的返回值(例如RetVal)。

问题出在给Shell命令提供的参数上。

获取整个命令字符串(不带引号),然后将其复制。

C:\Program Files\ANSYS Inc\ANSYS Student\v192\Framework\bin\Win64\runwb2.exe -I -R C:\Users\MARCIN\Documents\Ansys_import\basic_2.wbjn

如果字符串是根据字符串文字和变量值构建/连接的,则将命令字符串放入剪贴板的最简单方法是将提供命令字符串执行shell命令:

Dim cmd As String
cmd = "..." & "..." & "..."

Shell cmd ' place breakpoint here (F9)

在运行时遇到断点时,弹出立即窗格(Ctrl + G)并输出cmd变量的值:

?cmd
C:\Program Files\ANSYS Inc\ANSYS Student\v192\Framework\bin\Win64\runwb2.exe -I -R C:\Users\MARCIN\Documents\Ansys_import\basic_2.wbjn

现在您可以从那里复制它。

接下来,启动cmd.exe并粘贴命令字符串;会出现错误消息。

错误是as Tim Williams hinted earlier,与路径中的空格有关:您需要将其引用:

"C:\Program Files\ANSYS Inc\ANSYS Student\v192\Framework\bin\Win64\runwb2.exe" -I -R C:\Users\MARCIN\Documents\Ansys_import\basic_2.wbjn

如果此方法在cmd.exe中有效,那么您知道如何修复VBA代码-请记住,由于"双引号限制了字符串文字,因此您需要将它们加倍以便转义它们:< / p>

cmd = """C:\Program Files\ANSYS Inc\ANSYS Student\v192\Framework\bin\Win64\runwb2.exe"" -I -R C:\Users\MARCIN\Documents\Ansys_import\basic_2.wbjn"

最后,路径的C:\Users\MARCIN\Documents部分应该替换为%USERPROFILE%\DocumentsC:\Program Files替换为%PROGRAMFILES%

cmd = """%PROGRAMFILES%\ANSYS Inc\ANSYS Student\v192\Framework\bin\Win64\runwb2.exe"" -I -R %USERPROFILE%\Documents\Ansys_import\basic_2.wbjn"

或者,如果您想让VBA而不是Environ$("USERPROFILE")来查找变量,则可以在VBA中使用Environ$("PROGRAMFILES")cmd.exe来获取这些环境变量的字符串值。