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 einer For-Schleife eine IF-Bedingung einfügen (Systeminformationen auslesen)

Frage Entwicklung Batch & Shell

Mitglied: Rookie84

Rookie84 (Level 1) - Jetzt verbinden

15.09.2006, aktualisiert 27.09.2006, 6747 Aufrufe, 14 Kommentare

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
Mitglied: Biber
20.09.2006 um 09:54 Uhr
Moin Rookie84,

eine Möglichkeit wäre so:
01.
::------snipp GetAllTheFckingSysteminfos.bat [ungetestet] 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
date/t >Domäne_Server.txt 
04.
date/t >Domäne_Log.txt 
05.
FOR /f %%f IN (computer_domäne.txt) DO ( 
06.
  (systeminfo /S %%f /U domäne\USer /P*/FO CSV /NH >%temp%\thisinfo.tmp)  
07.
   if !errorlevel! GEQ 1 ( 
08.
       echo  %time%: %%f - ErrorLevel !ERRORLEVEL!>>Domäne_LOG.txt  
09.
   ) ELSE ( 
10.
    echo %time%: %%f okay>>Dömäne_SERVER.txt 
11.
    type %temp%\thisinfo.tmp>>Dömäne_SERVER.txt 
12.
13.
14.
::-----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
Bitte warten ..
Mitglied: Rookie84
20.09.2006 um 12:51 Uhr
Hallo Biber,

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

Gruß Rookie84
Bitte warten ..
Mitglied: Rookie84
26.09.2006 um 09:51 Uhr
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
Bitte warten ..
Mitglied: Biber
26.09.2006 um 10:58 Uhr
Moin Rookie84,

auch kein Problem.
Die Fehlermeldung kannst Du nach demselben Muster zwischenspeichern und später in Deine Logdatei übernehmen.
01.
systeminfo /S %%f /U domäne\USer /P*/FO CSV /NH >%temp%\thisinfo.tmp <b>2>%temp%\err.tmp</b> 
02.
... 
03.
:: ... und unter die Zeile " 
04.
echo  %time%: %%f - ErrorLevel !ERRORLEVEL!>>Domäne_LOG.txt  
05.
::...noch eine Zeile " 
06.
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
Bitte warten ..
Mitglied: Rookie84
26.09.2006 um 13:26 Uhr
Danke... funktioniert natürlich wieder einwandfrei!

da ergibt sich doch gleich wieder eine Frage...

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
Bitte warten ..
Mitglied: Biber
26.09.2006 um 13:34 Uhr
Natürlich auch kein Problem... ist ja nur ein Bätschelchen, nix kompliziertes..

ändere den Fehlerzweig wie folgt:

01.
... 
02.
set /p Errmsg=<%temp%\err.tmp 
03.
echo  %time%: %%f - !Errmsg! ErrorLevel !ERRORLEVEL!>>Domäne_LOG.txt  
04.
 
05.
rem ALTE ZEILE echo  %time%: %%f - ErrorLevel !ERRORLEVEL!>>Domäne_LOG.txt  
06.
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]
Bitte warten ..
Mitglied: Rookie84
26.09.2006 um 13:47 Uhr
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...
Bitte warten ..
Mitglied: Biber
26.09.2006 um 14:28 Uhr
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
Bitte warten ..
Mitglied: Rookie84
26.09.2006 um 14:44 Uhr
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...

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

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

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

Biber
Bitte warten ..
Mitglied: Rookie84
27.09.2006 um 08:45 Uhr
Finaler Code (v0.96b ):

01.
date/t >Domäne_Server.txt 
02.
date/t >Domäne_Log.txt 
03.
 
04.
@echo off & setlocal EnableDelayedExpansion 
05.
FOR /f %%f IN (computer_domäne.txt) DO ( 
06.
 
07.
  (systeminfo /S %%f /U domäne\user /P * /FO CSV /NH >%temp%\thisinfo.tmp 2>%temp%\err.tmp) 
08.
  
09.
   if !errorlevel! GEQ 1 ( 
10.
   set /p Errmsg=<%temp%\err.tmp 
11.
   echo %%f; !Errmsg!>>Domäne_Log.txt  
12.
 
13.
   ) ELSE ( 
14.
    type %temp%\thisinfo.tmp>>Domäne_Server.txt 
15.
16.
   )
Nochmals vielen DANK
Bitte warten ..
Mitglied: Biber
27.09.2006 um 09:27 Uhr
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"]
Bitte warten ..
Mitglied: Rookie84
27.09.2006 um 11:06 Uhr
er ist doch noch unter Batch & Shell! oder kann ich den beitrag auch schließen?
Bitte warten ..
Mitglied: Biber
27.09.2006 um 20:16 Uhr
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.
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ä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
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...