2016-06-14 8 views
2

Ich verwende die folgende Funktion in vielen meiner VBA-Projekte. Ich habe zunächst den Verweis auf das Windows Script Host Object-Modell hinzugefügt, um Intellisense zu nutzen, bin dann jedoch auf die späte Bindung umgestiegen, sodass ich nicht auf eine Menge Dinge verweisen musste.Kann DIR nicht von WScript Shell in VBA ausgeführt werden?

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 

Es funktioniert großartig, wenn Sie etwas tun, wie RunCMD("ping www.bing.com") oder RunCMD("winrs -r:" & strHost & " reg query hklm\system\currentcontrolset\services\cdrom /v start")

jedoch RunCMD("Dir c:\config* /a:-d /b /d /s") ausfällt, und cmd.StdErr.ReadAll gibt eine Objektvariable oder With-Block nicht gesetzt Fehler. Selbst ein einfacher RunCMD("Dir") schlägt fehl.

Warum macht DIR die WScript-Shell aus? Noch wichtiger: Wie kann ich die DIR-Funktion von CMD (nicht die DIR-Funktion von VBA) verwenden, um eine Liste von Dateien zu erhalten, die einem Suchmuster entsprechen?

+1

wahrscheinlich Dies bezieht sich nicht auf die Primärer Fehler, aber sollten Sie nicht Ihre Ausgabe in eine TXT-Datei leiten, die nach Abschluss der Operation geöffnet und bearbeitet wird? – Jeeped

+1

Haben Sie es mit 'Set oShell = CreateObject (" Cscript.Shell ")' versucht? – Jeeped

+0

Es gibt tatsächlich den Fehler "Das System kann die angegebene Datei nicht finden." – Brad

Antwort

3

Funktioniert es, wenn Sie Ihren Befehl dir Vorwort mit "cmd/c" und wickeln Sie Ihren DOS-Befehl in doppelte Anführungszeichen, wie

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

oder

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 - und da ist die Argumentation. Ausgezeichnet! – dbmitch