In einer For-Schleife eine IF-Bedingung einfügen (Systeminformationen auslesen)
Systeminformationen aller Windowsserver auslesen
Meine Aufgabe ist es die Systeminformationen aller Server auszulesen. Dies ist soweit auch kein Problem. Mein Programm liest aus einem Text-file "computer_domäne.txt" nacheinander alle Server ein und liest mit Hilfe des Befehls Systeminfo alle INformationen aus und schreibt sie in eine separate Datei:
date/t >Domäne_Server.txt
FOR /f %%f IN (computer_domäne.txt) DO (systeminfo /S %%f /U domäne\USer /P*/FO CSV /NH>>Dömäne_SERVER.txt)
Eine Erweiterung soll nun eine Fehlerüberprüfung sein. Sobald also der Server nicht angesprochen werden kann und/oder der Anmeldenamen und das Passwort nicht stimmen, soll der Servername und die Fehlermeldung in eine seperate Log-Datei geschrieben werden: >Domäne_LOG.txt.
Den Befehl von oben habe ich folgendermaßen mit zwei If-Bedingungen erweitert (und dem Befehl errorlevel, weiß nicht ob dieser richtig ist):
date/t >Domäne_Server.txt
date/t >Domäne_Log.txt
FOR /f %%f IN (computer_domäne.txt) DO (systeminfo /S %%f /U domäne\USer /P*/FO CSV /NH if ERRORLEVEL NEQ 0 %ERRORLEVEL% >>Domäne_LOG.txt if Errorlevel EQU 0 %%f >>Dömäne_SERVER.txt)
Leider funktioniert dieser BEfehl nicht:
Fehler: Argument/OPtion ungültig - 'if'
Geben sie Systeminfo /?um die Syntax anzuzeigen
Wäre euch sehr dankbar wenn ihr mir weiterhelfen könntet
Meine Aufgabe ist es die Systeminformationen aller Server auszulesen. Dies ist soweit auch kein Problem. Mein Programm liest aus einem Text-file "computer_domäne.txt" nacheinander alle Server ein und liest mit Hilfe des Befehls Systeminfo alle INformationen aus und schreibt sie in eine separate Datei:
date/t >Domäne_Server.txt
FOR /f %%f IN (computer_domäne.txt) DO (systeminfo /S %%f /U domäne\USer /P*/FO CSV /NH>>Dömäne_SERVER.txt)
Eine Erweiterung soll nun eine Fehlerüberprüfung sein. Sobald also der Server nicht angesprochen werden kann und/oder der Anmeldenamen und das Passwort nicht stimmen, soll der Servername und die Fehlermeldung in eine seperate Log-Datei geschrieben werden: >Domäne_LOG.txt.
Den Befehl von oben habe ich folgendermaßen mit zwei If-Bedingungen erweitert (und dem Befehl errorlevel, weiß nicht ob dieser richtig ist):
date/t >Domäne_Server.txt
date/t >Domäne_Log.txt
FOR /f %%f IN (computer_domäne.txt) DO (systeminfo /S %%f /U domäne\USer /P*/FO CSV /NH if ERRORLEVEL NEQ 0 %ERRORLEVEL% >>Domäne_LOG.txt if Errorlevel EQU 0 %%f >>Dömäne_SERVER.txt)
Leider funktioniert dieser BEfehl nicht:
Fehler: Argument/OPtion ungültig - 'if'
Geben sie Systeminfo /?um die Syntax anzuzeigen
Wäre euch sehr dankbar wenn ihr mir weiterhelfen könntet
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 40170
Url: https://administrator.de/forum/in-einer-for-schleife-eine-if-bedingung-einfuegen-systeminformationen-auslesen-40170.html
Ausgedruckt am: 25.12.2024 um 07:12 Uhr
14 Kommentare
Neuester Kommentar
Moin Rookie84,
eine Möglichkeit wäre so:
Wesentlich ist das Setzen der "DelayedExpansion" am Anfang des Batches und das Nutzen dieses Features durch Auswerten der "aktuellen" Errorlevel-Werte.
Das heißt, du musst
statt: %ErrorLevel% (= Wert von ErrorLevel beim Beginnen der FOR..IN..DO..Anweisung)
jetzt schreiben: !ErrorLevel! (= Wert von Errorlevel in der aktuell ausgeführten Schleife)
Eine andere Variante wäre das Ausführen des IF..ELSE-Teils in einem geCALLten Block.
[Beispiele dafür hier im Bereich Batch & Shell bei Forumssuche nach "DelayedExpansion"]
Ist aber so wie oben IMHO trotz alledem noch übersichtlicher.
Gruß
Biber
eine Möglichkeit wäre so:
::------snipp GetAllTheFckingSysteminfos.bat [ungetestet]
@echo off & setlocal EnableDelayedExpansion
date/t >Domäne_Server.txt
date/t >Domäne_Log.txt
FOR /f %%f IN (computer_domäne.txt) DO (
(systeminfo /S %%f /U domäne\USer /P*/FO CSV /NH >%temp%\thisinfo.tmp)
if !errorlevel! GEQ 1 (
echo %time%: %%f - ErrorLevel !ERRORLEVEL!>>Domäne_LOG.txt
) ELSE (
echo %time%: %%f okay>>Dömäne_SERVER.txt
type %temp%\thisinfo.tmp>>Dömäne_SERVER.txt
)
)
::-----Snapp GetAllTheFckingSysteminfos.bat
Wesentlich ist das Setzen der "DelayedExpansion" am Anfang des Batches und das Nutzen dieses Features durch Auswerten der "aktuellen" Errorlevel-Werte.
Das heißt, du musst
statt: %ErrorLevel% (= Wert von ErrorLevel beim Beginnen der FOR..IN..DO..Anweisung)
jetzt schreiben: !ErrorLevel! (= Wert von Errorlevel in der aktuell ausgeführten Schleife)
Eine andere Variante wäre das Ausführen des IF..ELSE-Teils in einem geCALLten Block.
[Beispiele dafür hier im Bereich Batch & Shell bei Forumssuche nach "DelayedExpansion"]
Ist aber so wie oben IMHO trotz alledem noch übersichtlicher.
Gruß
Biber
Moin Rookie84,
auch kein Problem.
Die Fehlermeldung kannst Du nach demselben Muster zwischenspeichern und später in Deine Logdatei übernehmen.
Die (jetzt ja schon zwei) *.tmp-Dateien sind in Deinem %temp%-Verzeichnis (siehe mit "set temp" am CMD-Prompt).
Und werden aus Schlampigkeit an Ende nicht gelöscht. Solltest Du noch ergänzen.
Gruß
Biber
auch kein Problem.
Die Fehlermeldung kannst Du nach demselben Muster zwischenspeichern und später in Deine Logdatei übernehmen.
systeminfo /S %%f /U domäne\USer /P*/FO CSV /NH >%temp%\thisinfo.tmp <b>2>%temp%\err.tmp</b>
...
:: ... und unter die Zeile "
echo %time%: %%f - ErrorLevel !ERRORLEVEL!>>Domäne_LOG.txt
::...noch eine Zeile "
type %temp%\err.tmp >>Domäne_LOG.txt
Und werden aus Schlampigkeit an Ende nicht gelöscht. Solltest Du noch ergänzen.
Gruß
Biber
Natürlich auch kein Problem... ist ja nur ein Bätschelchen, nix kompliziertes..
ändere den Fehlerzweig wie folgt:
Wenn es läuft, kannst Du ja noch mal den </i>final code</i> hier am Stück posten.
Gruß
Biber
[Edit]
Vorhin überlesen:
Kanal 1 = STDOUT = alle normalen Status/Fortschrittsmeldungen-->geht auf CON = Bildschirm
Kanal 2 = STDERR = alle Fehlermeldungen --> geht auch auf CON = Bildschirm.
Aber pfiffigerweise kann/darf ich das trennen (wie oben vorgekaspert) und in verschiedene Ziele umlenken.
[/Edit]
ändere den Fehlerzweig wie folgt:
...
set /p Errmsg=<%temp%\err.tmp
echo %time%: %%f - !Errmsg! ErrorLevel !ERRORLEVEL!>>Domäne_LOG.txt
rem ALTE ZEILE echo %time%: %%f - ErrorLevel !ERRORLEVEL!>>Domäne_LOG.txt
rem ALTE ZEILE type %temp%\err.tmp >>Domäne_LOG.txt
Wenn es läuft, kannst Du ja noch mal den </i>final code</i> hier am Stück posten.
Gruß
Biber
[Edit]
Vorhin überlesen:
achja und was bedeuted die "2" ->2>%temp%\err.tmp
Die "2" steht für den "Kanal", auf dem (Bildschirm-) Fehlermeldungen geschrieben werden.Kanal 1 = STDOUT = alle normalen Status/Fortschrittsmeldungen-->geht auf CON = Bildschirm
Kanal 2 = STDERR = alle Fehlermeldungen --> geht auch auf CON = Bildschirm.
Aber pfiffigerweise kann/darf ich das trennen (wie oben vorgekaspert) und in verschiedene Ziele umlenken.
[/Edit]
wieso zeigt es jetzt im Dos-Fenster eigtl nicht mehr an was es gerade ausführt?
Das ist die so genannte künstliche Intelligenz des M$-CMD-Interpreters... ab einer gewissen Ausgereiftheit einer Batchdatei geht der Interpreter davon aus, dass Du Bildschirmmeldungen selbst definieren kannst...
Nein, im Ernst: die Meldungen sind (fast alle) irgendwohin umgeleitet oder unterdrückt worden.
Aber niemand hindert Dich, zusätzlich noch eine Zeile rauszudrücken:
echo Systeminformationen von Rechner [...bla..] werden gelesen...
-oder-
title Systeminformationen von Rechner [...bla..] werden gelesen...
...
Können wir den Beitrag jetzt mal als "gelöst" markieren, bevor noch weiter dran rumfeilst ...?
Gruß
Biber
er ist doch noch unter Batch & Shell! oder kann ich den beitrag auch schließen?
Nein, er ist wieder unter Batch & Shell.
Da war wohl in den letzten zwei Tagen ein kleiner Bug unterwegs, der zu einigen Beiträgen führte, die keinem Bereich zugeordnet waren...
Und Dein Beitrag hing plötzlich auch ohne Zuordnung zu einem Bereich hier rum (ja, ich weiß, angelegt hattest Du ihn unter Batch & Shell, aber vorhin war er im Nirwana...)
Das hat unser Webmaster @Frank vorhin gefixt und Deinen Beitrag auch zurückverschoben/neu zugeordnet.
...und jetzt kann ich dat Dingen auch schließen.
Gruß
Biber
Ob einen "Beitrag schließen" auch der Ersteller machen kann oder nur der Moderator des Teil-Zweigs.....??
das weiß ich nicht, da ich noch nie in einem Bereich einen Beitrag eröffnet habe, wo ich nicht auch Moderator bin.