Я использую следующую функцию во многих проектах VBA. Сначала я добавил ссылку на модель объекта хоста Windows Script, чтобы воспользоваться преимуществами Intellisense, но затем переключился на позднюю привязку, поэтому мне не пришлось ссылаться на кучу вещей.Не удается запустить DIR из WScript Shell в VBA?
Private Function RunCMD(ByVal strCMD As String) As String
'Runs the provided command
Dim oShell As Object 'New WshShell
Dim cmd As Object 'WshExec
Dim x As Integer
Const WshRunning = 0
On Error GoTo wshError
x = 0
RunCMD = "Error"
Set oShell = CreateObject("Wscript.Shell")
Set cmd = oShell.Exec(strCMD)
'Debug.Print strCMD
'Stop
Do While cmd.Status = WshRunning
Sleep 100 'for 1/10th of a second
x = x + 1
If x > 1200 Then 'We've waited 2 minutes so kill it
cmd.Terminate
MsgBox "Error: Timed Out", vbCritical, "Timed Out"
End If
Loop
RunCMD = cmd.StdOut.ReadAll & cmd.StdErr.ReadAll
Set oShell = Nothing
Set cmd = Nothing
Exit Function
wshError:
On Error Resume Next
RunCMD = cmd.StdErr.ReadAll
Resume Next
End Function
Он отлично работает, когда вы делаете что-то вроде RunCMD("ping www.bing.com")
или RunCMD("winrs -r:" & strHost & " reg query hklm\system\currentcontrolset\services\cdrom /v start")
Однако RunCMD("Dir c:\config* /a:-d /b /d /s")
не удается, и cmd.StdErr.ReadAll
дает объектную переменную или с блоком не установлена ошибка. Даже простой RunCMD("Dir")
терпит неудачу.
Почему DIR создает оболочку оболочки WScript? Что еще более важно, как я могу использовать функцию DIR CMD (не DIR-функцию VBA!), Чтобы получить список файлов, соответствующих шаблону поиска?
Это, вероятно, не рассматривается первичный сбой, но не следует ли вам передавать сообщения в TXT-файл, который нужно открыть и обработать после завершения операции? – Jeeped
Вы пробовали его с помощью 'Set oShell = CreateObject (" Cscript.Shell ")'? – Jeeped
это фактически дает ошибку 'Системе не удается найти указанный файл.' – Brad