2016-06-14 3 views
2

Я использую следующую функцию во многих проектах 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!), Чтобы получить список файлов, соответствующих шаблону поиска?

+1

Это, вероятно, не рассматривается первичный сбой, но не следует ли вам передавать сообщения в TXT-файл, который нужно открыть и обработать после завершения операции? – Jeeped

+1

Вы пробовали его с помощью 'Set oShell = CreateObject (" Cscript.Shell ")'? – Jeeped

+0

это фактически дает ошибку 'Системе не удается найти указанный файл.' – Brad

ответ

3

ли работа, если предварить вашу команду Дире «CMD/с» и обернуть команду DOS в двойных кавычках, как

RunCmd("cmd /c ""DIR""") 

или

RunCmd("cmd /c ""Dir c:\config* /a:-d /b /d /s""") 
+4

https://blogs.technet.microsoft.com/heyscriptingguy/2004/08/10/how-can-i-call-the-dir-command/ –

+0

@Robin - и есть рассуждения. Отлично! – dbmitch

Смежные вопросы