Не удается запустить DIR из оболочки WScript в VBA?
Я использую следующую функцию во многих моих проектах VBA. Сначала я добавил ссылку на объектную модель Windows Script, чтобы воспользоваться преимуществами Intellisense, но затем переключился на позднюю привязку, поэтому мне не пришлось ссылаться на кучу вещей.
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!), Чтобы получить список файлов, которые соответствуют шаблону поиска?
1 ответ
Работает ли это, если вы вводите команду dir с помощью "cmd /c " и заключаете команду DOS в двойные кавычки, например
RunCmd("cmd /c ""DIR""")
или же
RunCmd("cmd /c ""Dir c:\config* /a:-d /b /d /s""")