我正在使用WshShell在Excel中从VBA运行批处理文件。
有人知道最近的更新是否可以做到这一点?或我可以使用的另一种方法?
这些子是:
Public Sub RunBatch(FPath As String)
Dim WinSh As Object
Dim StrCmd As String
Dim ErrCode As Long
Set WinSh = New WshShell
StrCmd = Chr(34) & FPath & Chr(34)
ErrCode = WinSh.Run(StrCmd, WindowStyle:=1, WaitOnReturn:=True)
End Sub
Public Sub RunBatch2(FPath As String)
Dim WinSh As Object
Set WinSh = VBA.CreateObject("WScript.Shell")
WinSh.Run FPath, 1, True
End Sub
问题的根源是Cisco AMP的安全策略的更新或更改。这会阻止Windows脚本宿主的使用。我组织的安全部门正在努力寻找解决方案。
同时,我找到了解决方法。我使用shell(在恢复VBA代码之前不等待批处理结束)来运行批处理,该批处理在过程结束时写入一个简单的文本文件,并且我等待文本文件以1秒的增量显示。它很粗糙,但到目前为止它仍然有效。
Public Sub OneRunBatch()
Dim xlWB As Workbook
Dim fso1 As New FileSystemObject
Dim BatFile As Object
Dim IsDone As Boolean
Dim OutFileName As String
Dim DoneFileName As String
Dim OutPath As String
Dim DeleteBatFile As Boolean
Set xlWB = ThisWorkbook
OutPath = xlWB.Path
OutFileName = "HW.bat"
DoneFileName = "Done.txt"
DeleteBatFile = False
Set BatFile = fso1.CreateTextFile(OutPath & "\" & OutFileName)
BatFile.WriteLine "cd /d " & OutPath
BatFile.WriteLine "echo Hello World"
BatFile.WriteLine "dir > " & DoneFileName
BatFile.Close
IsDone = False
Call Shell(OutPath & "\" & OutFileName, vbNormalFocus)
Do Until IsDone
If fso1.FileExists(OutPath & "\" & DoneFileName) Then IsDone = True
Application.Wait (Now + TimeValue("00:00:01"))
Loop
fso1.DeleteFile (OutPath & "\" & DoneFileName)
If DeleteBatFile Then fso1.DeleteFile (OutPath & "\" & OutFileName)
End Sub
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句