Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

In FOR-Schleife nur 1x Echo ausgeben, den Rest in der Reihenfolge normal abarbeiten

Frage Entwicklung Batch & Shell

Mitglied: evinben

evinben (Level 2) - Jetzt verbinden

17.03.2012, aktualisiert 17:48 Uhr, 3211 Aufrufe, 9 Kommentare

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:
01.
@echo off 
02.
setlocal 
03.
@prompt -$G 
04.
 
05.
:Meldung 
06.
echo. 
07.
echo Folgende Prozesse werden beendet 
08.
	for %%d in ( 
09.
Datenbank.exe 
10.
ServiceDat.exe 
11.
	) do  if /i %%d==%%f call :TaskKill 
12.
Echo Kein Prozess gefunden 
13.
pause 
14.
goto :eof 
15.
 
16.
:TaskKill 
17.
for /f  %%f in ('tasklist /NH /FI "imagename eq %%d"') do echo. & echo %%f & taskkill /F /IM  %%f 
18.
:Prozesse überprüfen, die manuell beendet werden sollen 
19.
	for %%d in ( 
20.
Outlook.exe 
21.
WINWORD.EXE 
22.
	) do for /f  %%f in ('tasklist /NH /FI "imagename eq %%d"') do if /i %%d==%%f echo. & echo %%f 
23.
 
24.
:M1 
25.
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
26.
echo Beenden Sie die Programme mit den hier aufgelisteten Prozessen manuell, um Datenverlust zu vermeiden. 
27.
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
28.
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
Mitglied: bastla
17.03.2012 um 18:06 Uhr
Hallo evinben!

Schematisch etwa so:
Vor der Schleife
01.
set "Ausgabe=Folgende Prozesse werden beendet"
und in der Schleife
01.
if defined Ausgabe ( 
02.
    echo %Ausgabe% 
03.
    set "Ausgabe=" 
04.
)
Deine Zeile 12 wird übrigens immer ausgegeben werden ...

Grüße
bastla
Bitte warten ..
Mitglied: evinben
17.03.2012 um 21:35 Uhr
Hallo bastla!

Danke dir - stimmt, das ist eine recht einfache Lösung. Was mir auch neu ist, dass nach echo %Ausgabe% kein & folgen muss.


Evinben
Bitte warten ..
Mitglied: evinben
17.03.2012 um 22:18 Uhr
Hallo bastla,

jetzt habe ich bemerkt, dass mit dem folgenden Code-Aufbau jeweils nur ein Prozess gekillt wird. Ich kann leider nicht schaffen die FOR-Schleife so umzustruktruieren, dass wenn die Variable %Meldung% (und auch %MeldungB%) nicht gesetzt ist der Rest trotzdem abgearbeitet werden soll - also dass !alle! Prozesse trotzdem gekillt werden sollen.

01.
echo off 
02.
setlocal 
03.
@prompt -$G 
04.
 
05.
:In der FOR-Schleife sind Prozesse in jeder Zeile einzutragen, die auf Aktivität überprüft und automatisch beendet werden sollen 
06.
 
07.
:Meldung 
08.
echo. 
09.
set "Meldung=Folgende Prozesse werden beendet" 
10.
 
11.
	for %%d in ( 
12.
 
13.
 
14.
Datenbank.exe  
15.
ServiceDat.exe  
16.
 
17.
	) do for /f  %%f in ('tasklist /NH /FI "imagename eq %%d"') do if /i %%d==%%f if defined Meldung echo %Meldung% & set "Meldung=" & set Gefunden=true & echo. & taskkill /F /IM  %%f 
18.
 
19.
:Prozesse überprüfen, die manuell beendet werden sollen 
20.
set "MeldungB=Beenden Sie die Programme mit den hier gelisteten Prozessen manuell, um Datenverlust zu vermeiden." 
21.
 
22.
	for %%d in ( 
23.
 
24.
EXCEL.EXE 
25.
WINWORD.EXE 
26.
 
27.
	) do for /f  %%f in ('tasklist /NH /FI "imagename eq %%d"') do if /i %%d==%%f if defined MeldungB call :MeldungB & set "MeldungB=" & set Gefunden=true & echo. & echo %%f 
28.
 
29.
goto :M2 
30.
 
31.
 
32.
:MeldungB 
33.
echo. 
34.
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
35.
echo %MeldungB% 
36.
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
37.
echo. 
38.
goto :eof 
39.
 
40.
:M2 
41.
 
42.
if not defined Gefunden Echo Kein Prozess gefunden 
43.
 
44.
 
45.
:END 
46.
pause >nul
Evinben
Bitte warten ..
Mitglied: bastla
17.03.2012 um 22:37 Uhr
Hallo evinben!

Es gibt ja keinen Zwang, alles in eine Zeile zu verwursten:
01.
for %%d in ( 
02.
 
03.
    Datenbank.exe  
04.
    ServiceDat.exe  
05.
 
06.
) do for /f %%f in ('tasklist /NH /FI "imagename eq %%d"') do ( 
07.
    if /i %%d==%%f ( 
08.
        if defined Meldung ( 
09.
            echo %Meldung% 
10.
            echo. 
11.
            set "Meldung=" 
12.
13.
        taskkill /F /IM  %%f 
14.
        set Gefunden=true 
15.
16.
)
Übrigens: Brauchst Du
if /i %%d==%%f
hinsichtlich
"imagename eq %%d"
wirklich?

Grüße
bastla
Bitte warten ..
Mitglied: evinben
18.03.2012 um 11:15 Uhr
Hallo Bastla,

vielen Dank für die Korrektur. 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. Richtig?
Allerdings was ich noch nicht verstehe ist, warum bei so einer Variant wie von dir vorgeschlagen (eine logische Zeile aber auf mehreren physikalischen Zeilen verteilt) kein &-Verkettungszeichen erforderlich ist?
Bei der nachfolgenden Varianten ist das &-Verkettungszeichen dagegen unverzichtbar – ohne es kriege ich den Code nicht zum Laufen:
01.
for %%d in ( 
02.
EXCEL.EXE 
03.
WINWORD.EXE 
04.
) do for /f  %%f in ('tasklist /NH /FI "imagename eq %%d"') do if /i %%d==%%f (if defined Meldung (echo %Meldung% & set "Meldung=")) & echo. & taskkill /F /IM  %%f & set Gefunden=true
Zurück zu deiner letzten Frage:
da TaskList auch dann eine Antwort ausgibt, wenn kein Prozess gefunden wurde („INFORMATION: Es werden keine Aufgaben mit den angegebenen Kriterien ausgeführt.“) hilft
01.
  
02.
if /i %%d==%%f
hier weiter, damit die folgenden Fehler-Zeilen, die im nächsten Schritt durch TaskKill generiert werden würden, auf dem Bildschirm nicht mehr erscheinen:
01.
FEHLER: Der Prozess "INFORMATION:" wurde nicht gefunden. 
02.
FEHLER: Der Prozess "INFORMATION:" wurde nicht gefunden. 
03.
FEHLER: Der Prozess "INFORMATION:" wurde nicht gefunden. 
04.
FEHLER: Der Prozess "INFORMATION:" wurde nicht gefunden.
Ein schönes Wochenende
Gruß
Evinben
Bitte warten ..
Mitglied: bastla
18.03.2012 um 11:45 Uhr
Hallo evinben!
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:
01.
for %%d in ( 
02.
EXCEL.EXE 
03.
WINWORD.EXE 
04.
) 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
Grüße
bastla

[Edit] Überflüssige Klammern entfernt [/Edit]
Bitte warten ..
Mitglied: evinben
18.03.2012 um 13:02 Uhr
Hallo bastla,

danke.

Diese Ausgabe kannst Du ja verhindern:
Es geht bei mir so nicht. So sieht es am CMD aus:
01.
C:\Windows\system32>tasklist /NH /FI "imagename eq blabla" 2>nul 
02.
INFORMATION: Es werden keine Aufgaben mit den angegebenen Kriterien ausgeführt.
Wenn der Prozess nicht gefunden wurde, wird die Meldung mit 2>nul weiterhin ausgegeben, die eine Fehlermeldung im nächsten Schritt (bei TaskKill) verursacht.

evinben
Bitte warten ..
Mitglied: bastla
18.03.2012 um 15:26 Uhr
Hallo evinben!

Ich habe das nur unter XP SP3 getestet und mit der Umleitung Erfolg ...

... aber zur Not sollte bei Dir dann
tasklist /NH /FI "imagename eq blabla"|findstr /v /c:"INFORMATION: Es"
funktionieren (um das gleich "an der Quelle" abzufangen) ...

Grüße
bastla
Bitte warten ..
Mitglied: evinben
18.03.2012 um 16:10 Uhr
Hallo bastla,

daher kommt es also - alles klar. Findstr mit dem Schalter /V wäre hier auch eine saubere Lösung (aber nur solange keine Umlauten u. a. Sonderzeichen im Umlaufen sind).

Nun habe ich wieder etwas tolles gelernt und bin im Batch-Bereich ein Schritt weiter gekommen.

Bis demnächst wieder

Gruß
Evinben
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst CMD: icacls in for-Schleife (2)

Frage von Lowrider614 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Problem bei einer For Schleife (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
gelöst For Schleife kaputt? (5)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...