In FOR-Schleife nur 1x Echo ausgeben, den Rest in der Reihenfolge normal abarbeiten
Hallo Administratoren,
ich schaffe leider nicht in einer FOR-Schleife nur 1x Echo auszugeben. Das ist eine Überschrift und lautet hier „Folgende Prozesse werden beendet“. Diese Echo-Zeile soll nur dann erscheinen, wenn während der Prüfung anhand der Prozess-Liste mind. ein aktives Prozess gefunden wurde. Wenn ich diese Zeile in der FOR-Schleife einfach miteinbaue, dann wird sie keine Überschrift mehr, da sie mit jedem gefundenen Prozess mehrmals ausgegeben wird (was zum Nachteil der Lesbarkeit ist).
Ich habe lang ausprobiert und gerätselt, wie ich das Problem mit der Übersichtlichkeit/Lesbarkeit auf einer eleganten Art lösen kann, bin ich aber nur zur einen Lösung gekommen, die funktioniert:
Die FOR-Schleife mit der Prozess-Liste im Batch zu verdoppeln (wenn bei der ersten Schleidf ein Prozess aus der Liste gefunden wurde, dann Echo und zu der nächsten FOR-Zeile springen, ansonsten anderes Echo Kein Prozess gefunden). Das hat aber den Nachteil, dass die Prozessliste an zwei Stellen im Batch verwaltet werden müssen – nicht schön.
Momentan ist es so, dass die Überschrift mit Echo „Folgende Prozesse werden beendet“ selbst dann ausgegeben wird, wenn kein Prozess gefunden wurde – ebenso nicht schön, da sie dann zur Verwirrung stiftet.
Obwohl es so elementar klingt schaffe ich leider nicht eine akzeptable Lösung mit meinen noch frisch gesammelten Batch-Erfahrungen zu finden.
Folgenden Code habe ich mir aufgebaut:
Mit CALL-Funktion habe ich auch eine Weile experimentiert, das ändert allerdings nichts an der Tatsache. Hier muss eine Lösung in so einer Art "Zähler" rein, die 1x ein bestimmtes Echo bzw. eine Variable u. s. ausgibt und es nicht mehr wiederhohlt.
Aber ich verlasse mich gerne auf eurer Kompetenz und bedanke mich für eure Unterstützung.
Den tollen Workshop zu der FOR-Schleife von @Friemler habe ich gelesen und werde ihn noch mehrmals durchlesen müssen.
Nochmal Danke für eure Tipps und Korrekturen.
Euer
evinben
ich schaffe leider nicht in einer FOR-Schleife nur 1x Echo auszugeben. Das ist eine Überschrift und lautet hier „Folgende Prozesse werden beendet“. Diese Echo-Zeile soll nur dann erscheinen, wenn während der Prüfung anhand der Prozess-Liste mind. ein aktives Prozess gefunden wurde. Wenn ich diese Zeile in der FOR-Schleife einfach miteinbaue, dann wird sie keine Überschrift mehr, da sie mit jedem gefundenen Prozess mehrmals ausgegeben wird (was zum Nachteil der Lesbarkeit ist).
Ich habe lang ausprobiert und gerätselt, wie ich das Problem mit der Übersichtlichkeit/Lesbarkeit auf einer eleganten Art lösen kann, bin ich aber nur zur einen Lösung gekommen, die funktioniert:
Die FOR-Schleife mit der Prozess-Liste im Batch zu verdoppeln (wenn bei der ersten Schleidf ein Prozess aus der Liste gefunden wurde, dann Echo und zu der nächsten FOR-Zeile springen, ansonsten anderes Echo Kein Prozess gefunden). Das hat aber den Nachteil, dass die Prozessliste an zwei Stellen im Batch verwaltet werden müssen – nicht schön.
Momentan ist es so, dass die Überschrift mit Echo „Folgende Prozesse werden beendet“ selbst dann ausgegeben wird, wenn kein Prozess gefunden wurde – ebenso nicht schön, da sie dann zur Verwirrung stiftet.
Obwohl es so elementar klingt schaffe ich leider nicht eine akzeptable Lösung mit meinen noch frisch gesammelten Batch-Erfahrungen zu finden.
Folgenden Code habe ich mir aufgebaut:
@echo off
setlocal
@prompt -$G
:Meldung
echo.
echo Folgende Prozesse werden beendet
for %%d in (
Datenbank.exe
ServiceDat.exe
) do if /i %%d==%%f call :TaskKill
Echo Kein Prozess gefunden
pause
goto :eof
:TaskKill
for /f %%f in ('tasklist /NH /FI "imagename eq %%d"') do echo. & echo %%f & taskkill /F /IM %%f
:Prozesse überprüfen, die manuell beendet werden sollen
for %%d in (
Outlook.exe
WINWORD.EXE
) do for /f %%f in ('tasklist /NH /FI "imagename eq %%d"') do if /i %%d==%%f echo. & echo %%f
:M1
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo Beenden Sie die Programme mit den hier aufgelisteten Prozessen manuell, um Datenverlust zu vermeiden.
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo.
Mit CALL-Funktion habe ich auch eine Weile experimentiert, das ändert allerdings nichts an der Tatsache. Hier muss eine Lösung in so einer Art "Zähler" rein, die 1x ein bestimmtes Echo bzw. eine Variable u. s. ausgibt und es nicht mehr wiederhohlt.
Aber ich verlasse mich gerne auf eurer Kompetenz und bedanke mich für eure Unterstützung.
Den tollen Workshop zu der FOR-Schleife von @Friemler habe ich gelesen und werde ihn noch mehrmals durchlesen müssen.
Nochmal Danke für eure Tipps und Korrekturen.
Euer
evinben
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 182139
Url: https://administrator.de/forum/in-for-schleife-nur-1x-echo-ausgeben-den-rest-in-der-reihenfolge-normal-abarbeiten-182139.html
Ausgedruckt am: 08.04.2025 um 22:04 Uhr
9 Kommentare
Neuester Kommentar
Hallo evinben!
Es gibt ja keinen Zwang, alles in eine Zeile zu verwursten:
Übrigens: Brauchst Du
hinsichtlich
wirklich?
Grüße
bastla
Es gibt ja keinen Zwang, alles in eine Zeile zu verwursten:
for %%d in (
Datenbank.exe
ServiceDat.exe
) do for /f %%f in ('tasklist /NH /FI "imagename eq %%d"') do (
if /i %%d==%%f (
if defined Meldung (
echo %Meldung%
echo.
set "Meldung="
)
taskkill /F /IM %%f
set Gefunden=true
)
)
if /i %%d==%%f
"imagename eq %%d"
Grüße
bastla
Hallo evinben!
Grüße
bastla
[Edit] Überflüssige Klammern entfernt [/Edit]
Jetzt habe ich verstanden, dass ein IF-Befehl in Klammern, unabhängig davon ob sein Ergebnis WAHR oder FALSCH ist, die Verarbeitung der nächsten Befehle nicht ausschließt.
Abgesehen davon, dass es ja auch noch ein "else
" gäbe, ist das "if
" ja nur einer von mehreren Befehlen (in der Klammer), sodass der Rest tatsächlich nicht davon abhängt ...eine logische Zeile aber auf mehreren physikalischen Zeilen verteilt
lässt sich mit umschließenden Klammern realisieren - dann wird tatsächlich alles zwischen den Klammern als eine einzige Anweisung (auch mit Konsequenzen hinsichtlich der Variablenauflösung) betrachtet ...da TaskList auch dann eine Antwort ausgibt, wenn kein Prozess gefunden wurde („INFORMATION: Es werden keine Aufgaben mit den angegebenen Kriterien ausgeführt.“)
Diese Ausgabe kannst Du ja verhindern:for %%d in (
EXCEL.EXE
WINWORD.EXE
) do for /f %%f in ('tasklist /NH /FI "imagename eq %%d" 2^>nul') do (if defined Meldung echo %Meldung% & set "Meldung=") & echo. & taskkill /F /IM %%f & set Gefunden=true
bastla
[Edit] Überflüssige Klammern entfernt [/Edit]