Batch automatisches öffnen und schließen eines Programms

Obinobi

Cadet 4th Year
Registriert
Mai 2005
Beiträge
94
Hallo Leute im Forum,

kennt sich bei euch jemand aus mit der Batch-Programmierung?

Ich bräuchte eine Batch, die ein Programm startet mit der nacheinander mehrere Dateien geöffnet werden. Da ich zu dem Programm nur eine Lizenz besitze, kann ich alle Dateien in einem Ordner nicht auf einmal öffnen. Beim Öffnen einer Datei wird automatisch eine *.cad und eine *.txt. erstellt. Ein Problem ist, dass das Programm die *.cad nicht auf einmal erstellt. Sobald ich das Programm zu früh schließe, habe ich dann eine fehlerhafte *.cad die ich nicht gebrauchen kann. Beim erfolgreichen Umwandeln steht in der *.txt : "Pozess abgeschlossen".

Was soll also meine Batch können:
Programm starten -> Datei öffnen -> wenn in der erzeugten *.txt "Prozess abgeschlossen steht Programm schließen -> Programm starten und nächste Datei öffnen

Mein Programm sieht bisher folgendermaßen aus:

For %%f In ( *.sldprt *.sldasm ) do start ( C:\<Programmpfad>\Programm.exe %cd%\%%f & timeout /t 20 & taskkill /F /IM Programm.exe

Der Timer mit den 20s ist leider nur eine unschicke Lösung.

Vielen Dank im Voraus!
 
Was steht genau in der txt drin? Ist das "Prozess abgeschlossen" immer an der gleichen Stelle? Sonst müsstest du da auch nochmal alle Zeilen durchgehen.
Das folgende ist zwar wahrscheinlich unnötig kompliziert, aber es könnte funktionieren, in dem Fall, dass in der txt (mit Dateinamen der Ausgangsdatei) jeweils nur eine Zeile mit Prozess abgeschlossen und sonst nichts steht.
Code:
@echo off
Setlocal EnableDelayedExpansion
for %%a in ( *.sldprt *.sldasm ) do (
set dateiname=%%~na
C:\<Programmpfad>\Programm.exe %cd%\%%a
:sprungmarke
FOR /F "delims=" %%b in (!dateiname!.txt) do (
IF NOT "%%b"=="Prozess abgeschlossen" goto sprungmarke) else (taskkill /F /IM Programm.exe)
)
 
Ich nehme an es handelt sich um Solidworks, dann kannst Du beim Start "/m <vollerpfad+Macroname>.swp" übergeben, das wird dann automatisch ausgeführt, eventuell reicht die Macro Aufzeichnungsfunktion von Solidworks, falls nicht können Macros auch auf die API zugreifen.
 
Wow, vielen Dank für die schnellen Antworten.

Ich habe mich mal mit dem Code von simpsonfan beschäftigt.

Bis zur Sprungmarke habe ich alles verstanden, aber danach...

:sprungmarke
FOR /F "delims=" %%b in (!dateiname!.txt) do (
IF NOT "%%b"=="Prozess abgeschlossen" goto sprungmarke) else (taskkill /F /IM Programm.exe)
)

Kann man überhaupt Schleifen in einer Batch verschachteln?
Wozu braucht man hier den Delimitor? Ich kann doch die zu suchende Zeichenfolge nicht erst in der IF-Bedingung angeben oder?

Würde evtl folgender Code funktionieren? Ich bin mir nicht sicher ob die Variable %%a erst dann den nächsten Wert zugewiesen bekommt, sobald das ELSE ausgeführt wird.

@echo off
Setlocal EnableDelayedExpansion
for %%a in ( *.txt ) do ( set dateiname=%%~na
echo %%a
echo !dateiname!
notepad %%a
:sprungmarke
find /i "Prozess Completed" !dateiname!.txt
IF errorlevel 1 (
echo Zeichenfolge NICHT gefunden
goto sprungmarke
) ELSE (
echo Zeichenfolge gefunden
)
)
 
Das delims deswegen, dass for in der txt nicht beim Leerzeichen stoppt (Standardeinstellung für delims ist ein Leerzeichen).
Grundsätzlich müsste man for Schleifen auch in Batches verschachteln können.

Mir ist aber aufgefallen, dass bei meinem und deinem Ansatz leider das Problem besteht, dass die Sprungmarke die for Schleife verlässt, nachdem also das erste mal das Prozess abgeschlossen nicht getroffen wird, wird zwar noch gesucht, bis in der aktuellen Datei Prozess abgeschlossen steht, die For Schleife führt aber leider den Rest nicht mehr aus.
Man müsste also quasi eine Sprungmarke for das For setzen, und dann vor ausführen des programms auch schon testen, ob die txt besteht, also ob der Vorgang bereits abgeschlossen wurde. Das würde dabei dann voraussetzen, dass die txt also vorher noch nicht besteht. Man könnte natürlich auch vorher schon suchen, ob in der txt Prozess abgeschlossen steht.

Will man find verwenden, könnte das quasi so aussehen:
Code:
@echo off
:sprungmarke1
for %%a in ( *.sldprt *.sldasm ) do (
find /i "Process Completed" %%~na.txt >NUL
if errorlevel 1 (
start C:\<Programmpfad>\Programm.exe %cd%\%%a
find /i "Process Completed" %%~na.txt >NUL
if errorlevel 1 (
goto sprungmarke1
) else (
taskkill /F /IM Programm.exe)
)
)
echo Alles abgeschlossen
pause

Zu deiner Frage wegen der zeichenfolge, wann die angegeben werden muss: FOR geht ja die txt Zeilenweise durch und vergleicht dann, ob die Zeile == Prozess abgeschlossen ist. Aber es geht natürlich (und evtl. auch besser) auch mit find.
Verwende ich find, kann ich hier dann auch die verzögerte Variablenexpansion abschlaten, die brauchte ich nur, damit das mit der verschachtelten FOR schleife klappt.
Das >NUL hab ich übrigens nur gemacht, damit nicht die ganze Ausgabe zugeschrieben wird.
 
Zuletzt bearbeitet:
Zurück
Oben