2016-06-14 1 views
2

J'utilise la fonction suivante dans beaucoup de mes projets VBA. J'ai d'abord ajouté la référence au modèle Windows Script Host Object pour tirer parti d'Intellisense, mais j'ai ensuite basculé vers une liaison tardive, donc je n'ai pas eu à faire référence à un tas de choses.Impossible d'exécuter DIR à partir de WScript Shell dans 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 

Il fonctionne très bien quand vous faites quelque chose comme RunCMD("ping www.bing.com") ou RunCMD("winrs -r:" & strHost & " reg query hklm\system\currentcontrolset\services\cdrom /v start")

Cependant RunCMD("Dir c:\config* /a:-d /b /d /s") échoue, et cmd.StdErr.ReadAll donne une variable objet ou avec le bloc d'erreur non défini. Même un simple RunCMD("Dir") échoue.

Pourquoi DIR fait-il disparaître la coquille WScript? Plus important encore, comment puis-je utiliser la fonction DIR de CMD (pas la fonction DIR de VBA!) Pour obtenir une liste de fichiers qui correspondent à un motif de recherche?

+1

Cela ne probablement répond pas à la Échec primaire, mais ne devriez-vous pas transmettre la sortie à un fichier TXT à ouvrir et manipuler une fois l'opération terminée? – Jeeped

+1

Avez-vous essayé avec Set oShell = CreateObject ("Cscript.Shell") '? – Jeeped

+0

il donne en fait l'erreur 'Le système ne peut pas trouver le fichier spécifié. ' – Brad

Répondre

3

Est-ce que ça marche si vous préfacer votre commande dir avec « cmd/c » et enveloppez votre commande DOS guillemets, comme

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

ou

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 - et il y a le raisonnement. Excellent! – dbmitch