I am using WshShell to run a batch file from VBA within Excel.
Anyone know if recent updates could do this? or of another method I could use?
The subs are:
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
The source of the problem is either an update or a change in the security policies of Cisco AMP. This blocks the use of Windows Scripting Host. The security department of my organisation is working to find a solution to the problem.
In the meantime, I found a way around it. I use shell (which does not wait for the batch to end before resuming the VBA code) to run the batch which writes a simple text file at the end of the process and I wait for the text file to appear in 1 second increments. It is crude but it works so far.
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