rookie84
Goto Top

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

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

Biber
Biber 20.09.2006 um 09:54:49 Uhr
Goto Top
Moin Rookie84,

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
Rookie84
Rookie84 20.09.2006 um 12:51:49 Uhr
Goto Top
Hallo Biber,

vielen Dank für deine Rückmeldung. Werde deinen Code nächste Woche ausprobieren (Urlaubface-wink) und Feedback geben ob das ganze funktioniert hat.

Gruß Rookie84
Rookie84
Rookie84 26.09.2006 um 09:51:17 Uhr
Goto Top
Hallo Biber,

der Code funktioniert einwandfrei... Vielen DANK
(ausser eine abschließende Klammer fehlt, falls es jemanden interessiert)

Hab noch zwei (Bonus/Kosmetik)-Fragen.

1. wo befindet sich denn diese tmp-datei? wird diese automatisch wieder gelöscht?

2. in das Fehlerlog wird ja jetzt immer der Servername + das Errorlevel reingeschrieben. Soweit OK. Nur wird ansatt der eigtl Fehlermeldung immer nur "ERRORlevel 1" reingeschrieben. Wie kann ich die tatsächliche Fehlermeldung, die ausgegeben wird in das log reinschreiben?
(BSP. "FEHLER: Klasse nicht registriert" oder "FEHLER: Der RPC-Server ist nicht verfügbar" anstatt "Errorlevel 1")

Vielen Dank
Grüße


Vielen DANK
Biber
Biber 26.09.2006 um 10:58:16 Uhr
Goto Top
Moin Rookie84,

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
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
Rookie84
Rookie84 26.09.2006 um 13:26:28 Uhr
Goto Top
Danke... funktioniert natürlich wieder einwandfrei!

da ergibt sich doch gleich wieder eine Frage...face-wink

ist es auch möglich, diese beiden Informationen in eine Zeile zu schreiben?

BEispiel:
Alt/jetzt:
Server0001 - ErrorLevel 1
FEHLER: Der RPC-Server ist nicht verfgbar.

Neu/gewünscht: Server0001 - ErrorLevel 1 FEHLER: Der RPC-Server ist nicht verfgbar.

das müsste doch eigtl auch möglich sein oder? also das praktisch der echo und type-befehl in eine zeile eingefügt werden... ich hoffe ich habe mich nicht allzu kompliziert ausgedrückt...

achja und was bedeuted die "2" ->2>%temp%\err.tmp

Vielen Dank
Grüße
Rookie84

Vielen Dank
Biber
Biber 26.09.2006 um 13:34:15 Uhr
Goto Top
Natürlich auch kein Problem... ist ja nur ein Bätschelchen, nix kompliziertes.. face-wink

ä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]
Rookie84
Rookie84 26.09.2006 um 13:47:54 Uhr
Goto Top
Danke funktioniert wieder.... der finale Code kommt sobal es fertig ist!

wieso zeigt es jetzt im Dos-Fenster eigtl nicht mehr an was es gerade ausführt?
es werden keinerlei fehlermeldungen mehr angezeigt und auch nicht, dass gerade die Systeminformationen ausgelesen werden!
Bsp. "Prozessorinformationen werden geladen...."

fand das ganz praktisch, wenn das im DOS-fenster während des Programmdurchlaufs angezeigt wird...

ich meine dabei nicht, dass die ganzen BEfehle im DOS-FEsnter stehen... dies wird ja durch das echo off ausgeschalten...
Biber
Biber 26.09.2006 um 14:28:42 Uhr
Goto Top
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... face-wink

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 ...?
face-wink

Gruß
Biber
Rookie84
Rookie84 26.09.2006 um 14:44:58 Uhr
Goto Top
danke... habs mir fast gedacht, weil das plötzlich nicht mehr kam, obwohl ich nur eine Zeile hinzugefügt habe!

hab den grünen haken gesetzt...-> Beitrag gelöst, eigtl schon nach deiner ersten Antwort, aber... face-wink

der versprochene finalcode kommt sobald ich endgültig fertig bin!

nochmal vielen DANK!
Biber
Biber 26.09.2006 um 15:39:12 Uhr
Goto Top
Tja, rookie84,
.. kommt sobald ich endgültig fertig bin...
Lieber, wenn der Batch endgültig fertig ist - das geht schneller face-wink

Danke schon fürs Endergebnis (die so genannte "v0.96b") *feix*

Biber
Rookie84
Rookie84 27.09.2006 um 08:45:06 Uhr
Goto Top
Finaler Code (v0.96b face-wink):

date/t >Domäne_Server.txt
date/t >Domäne_Log.txt

@echo off & setlocal EnableDelayedExpansion
FOR /f %%f IN (computer_domäne.txt) DO (

  (systeminfo /S %%f /U domäne\user /P * /FO CSV /NH >%temp%\thisinfo.tmp 2>%temp%\err.tmp)
 
   if !errorlevel! GEQ 1 (
   set /p Errmsg=<%temp%\err.tmp
   echo %%f; !Errmsg!>>Domäne_Log.txt 

   ) ELSE (
    type %temp%\thisinfo.tmp>>Domäne_Server.txt
   )
   )

Nochmals vielen DANK
Biber
Biber 27.09.2006 um 09:27:01 Uhr
Goto Top
Gern geschehen, Rookie.

Ich setze diesen Beitrag guten Gewissens auf "Geschlossen".

Grüße
Biber
[Edit: Uupps, nanu... kann ich gar nicht - der ist gar nicht mehr im Bereich "Batch & Shell"]
Rookie84
Rookie84 27.09.2006 um 11:06:36 Uhr
Goto Top
er ist doch noch unter Batch & Shell! oder kann ich den beitrag auch schließen?
Biber
Biber 27.09.2006 um 20:16:20 Uhr
Goto Top
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.