Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA CMD Output Variable

VBA CMD Output Variable
25.03.2015 10:45:03
Uwe
Hallo zusammen,
ich habe folgendes vor. Ich möchte über VBA und PsExec ein Programm auf einen anderen PC im Netzwerk installieren. Das funktioniert soweit auch. Nun kommt das Problem das ich das Errorlevel nicht abfangen kann. Weil er beim Errorlevel ja nur feststellt ob die CMD erfolgreich gelaufen ist und nicht ob der Code der CMD erfolgreich gelaufen ist. Ist es Möglich eventuell die Ausgabe der CMD in eine Varabile zu schreiben ?
Hier mein Code

Set objShell = CreateObject("Wscript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objNTInfo = CreateObject("WinNTSystemInfo")
strPSExec = "C:\temp\PSExec.exe"
strPSExec = objFSO.GetFile(strPSExec).ShortPath
strUser = "Administrator"
strPass = "1234Test"
strCmdPSE = "cmd /c " & strPSExec & " \\PC0001 " & " -u " & strUser & " -p " & strPass & " c:\   _
_
_
windows\system32\msiexec.exe /i C:\Software\Sun125.msi"
strRealCmd = strCmdPSE & " & echo %ERRORLEVEL% & pause"
objShell.Run strRealCmd

Danke schonmal
Grüße Uwe

Anzeige

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA CMD Output Variable
26.03.2015 16:24:29
Michael
Hallo Uwe,
schau Dir mal das da an: http://www.office-loesung.de/ftopic355471_0_0_asc.php
Das hab ich mir aus dieser und anderen Quellen ähnlich irgendwann mal zusammengebastelt:
Sub Aufruf()
Dim objShell As Object, objExec As Object
Dim strTarget, strResult As String
' Aufruf .EXE
Set objShell = CreateObject("WScript.Shell")
strTarget = "cmd /c ping www.herber.de"
Set objExec = objShell.Exec(strTarget)
Do While Not objExec.StdOut.AtEndOfStream
strResult = objExec.StdOut.ReadLine()
Debug.Print strResult
Loop
Set objShell = Nothing
End Sub
Ich bin mir jetzt nicht sicher, ob Du beim Aufruf eines "externen" Programmes überhaupt das cmd /c benötigst, da sollte eigentlich der Pfad zur EXE reichen. Ping ist ein "interner" Aufruf von command.com, oder?
Schöne Grüße,
Michael
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

VBA CMD Output in eine Variable speichern


Schritt-für-Schritt-Anleitung

Um die Ausgabe eines CMD-Befehls in eine Variable in Excel VBA zu speichern, kannst Du die folgende Vorgehensweise nutzen. In diesem Beispiel verwenden wir das WScript.Shell-Objekt, um einen CMD-Befehl auszuführen und die Ausgabe in einer Variable zu speichern.

  1. Öffne den VBA-Editor in Excel (ALT + F11).

  2. Füge ein neues Modul hinzu (Rechtsklick auf "VBAProject" > Einfügen > Modul).

  3. Kopiere und füge den folgenden Code in das Modul ein:

    Sub Aufruf()
       Dim objShell As Object, objExec As Object
       Dim strTarget As String
       Dim strResult As String
    
       ' CMD-Befehl definieren
       strTarget = "cmd /c ping www.herber.de"
    
       ' WScript.Shell-Objekt erstellen
       Set objShell = CreateObject("WScript.Shell")
    
       ' CMD-Befehl ausführen
       Set objExec = objShell.Exec(strTarget)
    
       ' Ausgabe lesen, bis das Ende erreicht ist
       Do While Not objExec.StdOut.AtEndOfStream
           strResult = objExec.StdOut.ReadLine()
           Debug.Print strResult ' Ausgabe in das Direktfenster
       Loop
    
       ' Objekte freigeben
       Set objShell = Nothing
       Set objExec = Nothing
    End Sub
  4. Führe das Makro aus, um die Ausgabe des ping-Befehls in der Debug-Konsole zu sehen.


Häufige Fehler und Lösungen

  • Fehler: "Objektvariable oder With-Blockvariable nicht festgelegt"

    • Stelle sicher, dass Du das WScript.Shell-Objekt korrekt erstellt hast und dass der CMD-Befehl gültig ist.
  • Problem mit ERRORLEVEL

    • Um den Errorlevel abzufangen, kannst Du den Befehl echo %ERRORLEVEL% am Ende Deines CMD-Befehls anfügen.

    Beispiel:

    strTarget = "cmd /c ping www.herber.de & echo %ERRORLEVEL%"

Alternative Methoden

Eine andere Möglichkeit, die Ausgabe eines CMD-Befehls zu erhalten, ist die Verwendung von Shell anstelle von Exec. Beachte jedoch, dass Shell die Ausgabe nicht direkt zurückgibt.

Dim returnValue As Long
returnValue = Shell("cmd /c dir C:\", vbNormalFocus)

Hierbei erhältst Du jedoch nicht die Ausgabe, sondern nur den Rückgabewert des CMD-Befehls (Errorlevel).


Praktische Beispiele

  1. Ping-Befehl mit Errorlevel abfragen:

    Sub PingTest()
       Dim objShell As Object
       Dim strOutput As String
       Set objShell = CreateObject("Wscript.Shell")
       strOutput = objShell.Exec("cmd /c ping www.google.com & echo %ERRORLEVEL%").StdOut.ReadAll()
       Debug.Print strOutput
    End Sub
  2. MSI-Installation auf einem Remote-PC:

    Sub InstallMsi()
       Dim objShell As Object
       Dim strCmd As String
       strCmd = "cmd /c C:\temp\PSExec.exe \\PC0001 -u Administrator -p 1234Test msiexec.exe /i C:\Software\Sun125.msi & echo %ERRORLEVEL%"
       Set objShell = CreateObject("Wscript.Shell")
       Debug.Print objShell.Exec(strCmd).StdOut.ReadAll()
    End Sub

Tipps für Profis

  • Nutze Debug.Print, um die Ausgaben während der Entwicklung zu überprüfen.
  • Setze Option Explicit am Anfang Deines Moduls, um sicherzustellen, dass alle Variablen deklariert werden.
  • Experimentiere mit verschiedenen CMD-Befehlen, um zu sehen, wie sie in VBA funktionieren, z.B. dir, tasklist, etc.

FAQ: Häufige Fragen

1. Wie kann ich die Ausgabe eines CMD-Befehls in eine Excel-Zelle schreiben? Du kannst die Ausgabe einfach einer Zelle zuweisen, indem Du den Wert von strResult in eine Zelle schreibst, z.B.:

Cells(1, 1).Value = strResult

2. Was ist der Unterschied zwischen Exec und Run in VBA? Exec ermöglicht es, die Standardausgabe eines Befehls zu lesen, während Run den Befehl ausführt, ohne die Ausgaben zurückzugeben.

3. Wie kann ich mehrere CMD-Befehle in einer Zeile ausführen? Verwende & zwischen den Befehlen, z.B.:

strTarget = "cmd /c dir C:\ & echo %ERRORLEVEL%"

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige