Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Batch starten und warten

Batch starten und warten
Ralf_P
Hallo zusammen,
ich möchte eine *.bat aufrufen deren fertigstellung abwarten.
Folgenden code habe ich im archiv gefunden:

Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const WAIT_TIMEOUT = &H102&
Declare
Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare
Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long


Sub DOSShell()
WartenBisFertig ("C:\Programme\Dyn\bin\test.bat")
MsgBox "FERTIG"
End Sub
Sub WartenBisFertig(strEXE As String)
Dim ProcessID As Long
Dim hProcess As Long
Dim RetVal As Long
ProcessID = Shell(strEXE, vbHide)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID)
Do
DoEvents
RetVal = WaitForSingleObject(hProcess, 50)
Loop Until RetVal  WAIT_TIMEOUT
End Sub

Mein Problem ist, dass die test.bat startet, aber die MSGBOX sofort erscheint.
Anscheinend wird auch nicht die cmd.exe überwacht, welche die test.bat abarbeitet.
Irgendwie bekomme ich das nicht zum laufen.
Könnt Ihr mir auf die Sprünge helfen?
Viele Grüße, Ralf
Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Auf Anwendung warten!
07.05.2010 10:32:55
Backowe
Hi Ralf,
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type
Private Declare Function WaitForSingleObject Lib "kernel32" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CreateProcessA Lib "kernel32" _
(ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes  _
As Long, _
ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As  _
Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As String, lpStartupInfo As STARTUPINFO, _
lpProcessInformation As _
PROCESS_INFORMATION) As Long
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const INFINITE = -1&
Public Function ExecCmd(cmdline$)
Dim proc As PROCESS_INFORMATION
Dim Start As STARTUPINFO
Dim ret&
' Initialize the STARTUPINFO structure:
Start.cb = Len(Start)
' Start the shelled application:
ret& = CreateProcessA(vbNullString, cmdline$, 0&, 0&, 1&, _
NORMAL_PRIORITY_CLASS, 0&, vbNullString, Start, proc)
' Wait for the shelled application to finish:
ret& = WaitForSingleObject(proc.hProcess, INFINITE)
Call GetExitCodeProcess(proc.hProcess, ret&)
Call CloseHandle(proc.hThread)
Call CloseHandle(proc.hProcess)
ExecCmd = ret&
End Function
Sub test()
ExecCmd ("notepad.exe")
MsgBox "Fertig"
End Sub

Anzeige
AW: Auf Anwendung warten!
07.05.2010 10:45:11
Ralf_P
Hallo,
vielen Dank erstmal - werde es gleich mal testen.
AW: Klappt hervorragend
07.05.2010 12:02:02
Ralf_P
Hallo,
Habe Deinen Code folgendermaßen angepasst:
Sub test()
ExecCmd ("C:\Programme\Dyn\bin\test.bat")
MsgBox "Fertig"
End Sub
Jetzt muß ich mir nur noch die Zeit nehmen, um die Zusammenhänge zu verstehen ;-)
Vielen Dank für die schnelle Hilfe.
Gruß, Ralf
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Batch starten und warten in Excel


Schritt-für-Schritt-Anleitung

Um eine Batch-Datei von Excel aus zu starten und zu warten, bis sie abgeschlossen ist, kannst du den folgenden VBA-Code verwenden. Dieser Code ruft die Batch-Datei auf und zeigt eine Messagebox an, wenn der Prozess beendet ist.

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  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:
Private Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lpTitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Long
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type

Private Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessID As Long
    dwThreadID As Long
End Type

Private Declare Function WaitForSingleObject Lib "kernel32" _
    (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CreateProcessA Lib "kernel32" _
    (ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, _
    ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
    ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As String, lpStartupInfo As STARTUPINFO, _
    lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Public Function ExecCmd(cmdline As String)
    Dim proc As PROCESS_INFORMATION
    Dim Start As STARTUPINFO
    Dim ret As Long
    Start.cb = Len(Start)
    ret = CreateProcessA(vbNullString, cmdline, 0, 0, 1, 0, 0, vbNullString, Start, proc)
    ret = WaitForSingleObject(proc.hProcess, INFINITE)
    Call CloseHandle(proc.hThread)
    Call CloseHandle(proc.hProcess)
End Function

Sub test()
    ExecCmd ("C:\Programme\Dyn\bin\test.bat")
    MsgBox "Fertig"
End Sub
  1. Ersetze den Pfad "C:\Programme\Dyn\bin\test.bat" mit dem Pfad deiner Batch-Datei.
  2. Schließe den VBA-Editor und führe das Makro test aus.

Dieser Code wartet, bis die Batch-Datei abgeschlossen ist, bevor die Messagebox angezeigt wird.


Häufige Fehler und Lösungen

  • Fehler: Die MsgBox erscheint sofort.

    • Überprüfe, ob die Batch-Datei ordnungsgemäß funktioniert und keine weiteren Prozesse startet. Stelle sicher, dass die Batch-Datei nicht in einem neuen Fenster ausgeführt wird, da dies zu einem sofortigen Rückgabewert führen kann.
  • Fehler: Die Batch-Datei wird nicht gefunden.

    • Vergewissere dich, dass der Pfad zur Batch-Datei korrekt ist. Teste den Pfad in der Windows-Eingabeaufforderung (cmd), um sicherzustellen, dass die Datei erreichbar ist.

Alternative Methoden

Eine alternative Methode, um eine Batch-Datei in Excel auszuführen, könnte die Verwendung von Shell sein. Der folgende Code zeigt, wie du die Shell-Methode nutzen kannst, um die Batch-Datei zu starten.

Sub RunBatch()
    Dim returnValue As Double
    returnValue = Shell("C:\Programme\Dyn\bin\test.bat", vbNormalFocus)
    MsgBox "Batch gestartet! Rückgabewert: " & returnValue
End Sub

Beachte, dass diese Methode nicht auf das Ende der Batch-Datei wartet.


Praktische Beispiele

Hier sind einige praktische Beispiele, wie du Batch-Dateien aus Excel starten kannst:

  1. Batch warten 5 Sekunden: Du kannst eine Pause in deine Batch-Datei einfügen, um den Prozess zu verlangsamen.

    @echo off
    timeout /t 5
    echo "5 Sekunden warten..."
  2. CMD-Befehle in einer Batch-Datei: Du kannst auch CMD-Befehle direkt in der Batch-Datei verwenden, um verschiedene Aufgaben zu erledigen.

    @echo off
    dir C:\
    pause

Tipps für Profis

  • Verwendung von Variablen: Du kannst Variablen in deiner Batch-Datei verwenden, um dynamische Werte zu setzen.
  • Batch-Messagebox erstellen: Du kannst ein VBS-Skript aus der Batch-Datei aufrufen, um eine Messagebox anzuzeigen, wenn der Prozess abgeschlossen ist.
@echo off
echo "Task abgeschlossen!"
start /wait wscript.exe "C:\Pfad\zu\deinem\script.vbs"
  • Batch warten: Wenn du mehrere Batch-Dateien nacheinander ausführen möchtest, kannst du die start /wait-Option verwenden.

FAQ: Häufige Fragen

1. Wie lange kann ich eine Batch-Datei warten? Du kannst die Zeit in der Batch-Datei selbst mit timeout angeben, um zum Beispiel 5 Sekunden zu warten.

2. Kann ich auch Parameter an die Batch-Datei übergeben? Ja, du kannst Parameter direkt beim Aufruf der Batch-Datei in der ExecCmd-Funktion übergeben. Zum Beispiel: ExecCmd ("C:\Programme\Dyn\bin\test.bat Parameter1 Parameter2").

3. Funktioniert das auf allen Excel-Versionen? Ja, dieser Code sollte in Excel 2010 und späteren Versionen funktionieren, solange VBA unterstützt wird.

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