42908
22.10.2007, aktualisiert am 13.11.2007
6851
19
0
Prozentzahl aus Textdatei via Batch auslesen und verwenden
Hallo,
ich habe folgendes Problem:
Mit einer Batch und dem Tool PSInfo habe ich von verschiedenen Servern in unsrem Netzwerk jeweils die Daten über die Festplattenbelegung bezogen.
Dabei wird das Ergebnis in eine Textdatei geschrieben und danach noch mittels "findstr" nur die bestimmten Zeilen herausgefiltert und diese dann in eine weitere Textdatei geschrieben. Diese hat dann folgendes Schema:
--> ist jetzt ein wenig verschoben (copy&paste)
[[[--Jetzt nicht mehr dank -Formatierung. Biber---]]
Aber auf jeden Fall ist die Prozentzahl mit dem freien Speicherplatz immer an der gleichen Stelle.
Ist es irgendwie möglich, dass ich diese Zahl nun auslese und mit einem if-Anweisung den Befehl zum senden einer E-Mail starte, wenn die Zahl kleiner als 10 wäre?
Mein Hauptproblem ist es eben an diese Zahl ran zu kommen und diese dann evtl als Variable zu setzen. (set)
Danach könnte ich ja einfach mit einer anderen IF-Anweisung checken, ob die Variable "variable1" kleiner als 10 ist und dem entsprechend weitere Befehle starten.
Vielen Dank für Euer bemühen!
Gruß,
Patrick
ich habe folgendes Problem:
Mit einer Batch und dem Tool PSInfo habe ich von verschiedenen Servern in unsrem Netzwerk jeweils die Daten über die Festplattenbelegung bezogen.
Dabei wird das Ergebnis in eine Textdatei geschrieben und danach noch mittels "findstr" nur die bestimmten Zeilen herausgefiltert und diese dann in eine weitere Textdatei geschrieben. Diese hat dann folgendes Schema:
---------------------------------------------------------------------------------------
Servername: xxxxxxx
Volume Type Format Label Size Free Free
C: Fixed NTFS 8.00 GB 3.86 GB 48.3%
D: Fixed NTFS Volume1 41.01 GB 27.40 GB 66.8%
--> ist jetzt ein wenig verschoben (copy&paste)
[[[--Jetzt nicht mehr dank -Formatierung. Biber---]]
Aber auf jeden Fall ist die Prozentzahl mit dem freien Speicherplatz immer an der gleichen Stelle.
Ist es irgendwie möglich, dass ich diese Zahl nun auslese und mit einem if-Anweisung den Befehl zum senden einer E-Mail starte, wenn die Zahl kleiner als 10 wäre?
Mein Hauptproblem ist es eben an diese Zahl ran zu kommen und diese dann evtl als Variable zu setzen. (set)
Danach könnte ich ja einfach mit einer anderen IF-Anweisung checken, ob die Variable "variable1" kleiner als 10 ist und dem entsprechend weitere Befehle starten.
Vielen Dank für Euer bemühen!
Gruß,
Patrick
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 71571
Url: https://administrator.de/contentid/71571
Ausgedruckt am: 24.11.2024 um 13:11 Uhr
19 Kommentare
Neuester Kommentar
Moin System#Schneider,
eigentlich kein großer Akt...aber....
Im Moment stehen die Prozentangaben zwar (absolut gezählt) an der gleichen Spaltenposition und wären mit der eingebauten CMD-Substring-Funktion dort rausfieselbar, aber..
Ich würde eher den Weg der Zeilen-Zerlegung über FOR /F-Anweisung und "tokens" vorziehen.
Dazu wäre allerdings VORHER nötig, dass die bislang namenlose Platte C: einen Namen bekommt ("Just4Biber" z.B.). Sonst haben nämlich die Zeilen unterschiedlichen Aufbau.
Wenn also alle Platten auch ein Volumelabel hätten, dann wäre der proof of concept diese Zeile am CMD-Prompt:
---> bedeutet: mit dieser FOR /F-Anweisung bekommst Du die für Dich relevanten Infos (Welche Platte und Prozentzahl heraus.
Du könntest also eine ähnliche Zeile in einer Batchdatei verwenden und dort im Fall "Prozentwert kleiner 10%" eine Mail mit blat.exe losjagen
Skizze:
Grüße
Biber
eigentlich kein großer Akt...aber....
Im Moment stehen die Prozentangaben zwar (absolut gezählt) an der gleichen Spaltenposition und wären mit der eingebauten CMD-Substring-Funktion dort rausfieselbar, aber..
Ich würde eher den Weg der Zeilen-Zerlegung über FOR /F-Anweisung und "tokens" vorziehen.
Dazu wäre allerdings VORHER nötig, dass die bislang namenlose Platte C: einen Namen bekommt ("Just4Biber" z.B.). Sonst haben nämlich die Zeilen unterschiedlichen Aufbau.
Wenn also alle Platten auch ein Volumelabel hätten, dann wäre der proof of concept diese Zeile am CMD-Prompt:
>for /f "tokens=1,11 delims=. " %a in ('findstr "%" daddeldu.log') do @echo a[%a] b[%b]
a[C:] b[48]
a[D:] b[66]
Du könntest also eine ähnliche Zeile in einer Batchdatei verwenden und dort im Fall "Prozentwert kleiner 10%" eine Mail mit blat.exe losjagen
Skizze:
.....
FOR /F ....%%a in (....) DO Call :TestLowLimit %%a %%b
goto :eof
:TestLowLimit Parm1 ist Laufwerksbuchstabe Parm2 ist Prozentzzahl ganzzahlig.
Set /a perc=%2
If %perc% GEQ 10 goto :eof
....Andernfalls
machMir den Blat mit Betreff "%date% %time% Auf Lw %1 sind nur noch %2 Prozent frei.
Grüße
Biber
Moin Patrick,
%%a und %%b sind in diesem Fall "dynamische Variablen", die nur existieren, solange die FOR/F-Anweisung ausgeführt wird.
Deshalb kopiere ich die Variale %%b um in eine "statische"/dauerhafte Variable namens %perc%.
Diese kann ich dann in der Tat auch numerisch (mit LEQ, EQU etc) mit einem Zahlenwert vergleichen.
Mit der dynamischen Variablen %%b könnte ich unter Umständen das Problem haben, dass deren Inhalt nicht zwingend als Zahl erkannt wird und dann "zeichenweise" verglichen wird.
Und da käme dann bei "IF %%b LEQ 10 " im Falle fünf Prozent "IF 5 LEQ 10.." bei einem ZEICHEN-Vergleich das Verkehrte heraus [weil das ZEICHEN "5" niemals kleiner ist als das Zeichen "1" (das erste Zeichen des Strings "10".
Deshalb diese Umkopiererei mit "Set /a perc=%2" in eine "numerische Variable.
Grüße
Biber
%%a und %%b sind in diesem Fall "dynamische Variablen", die nur existieren, solange die FOR/F-Anweisung ausgeführt wird.
Deshalb kopiere ich die Variale %%b um in eine "statische"/dauerhafte Variable namens %perc%.
Diese kann ich dann in der Tat auch numerisch (mit LEQ, EQU etc) mit einem Zahlenwert vergleichen.
Mit der dynamischen Variablen %%b könnte ich unter Umständen das Problem haben, dass deren Inhalt nicht zwingend als Zahl erkannt wird und dann "zeichenweise" verglichen wird.
Und da käme dann bei "IF %%b LEQ 10 " im Falle fünf Prozent "IF 5 LEQ 10.." bei einem ZEICHEN-Vergleich das Verkehrte heraus [weil das ZEICHEN "5" niemals kleiner ist als das Zeichen "1" (das erste Zeichen des Strings "10".
Deshalb diese Umkopiererei mit "Set /a perc=%2" in eine "numerische Variable.
Kann ich deinen [FOR /F]-Befehl 1zu1 übernehmen?
Ja, nur jeweils im Batch zwei Prozentzeichen statt einem vor dynamischen Variablen ( %%a statt %a..).Grüße
Biber
Moin Patrick,
skizziert würde es so aussehen:
Grüße
Biber
skizziert würde es so aussehen:
....
:: ... in einem Batch...
for /f "tokens=1,11 delims=. " %%a in ('findstr "%" daddeldu.log') do call :TestLowLimit %%a %%b
goto :eof
:TestLowLimit ...siehe oben
Set /a perc=%2
::---- in der vorangegangenen Zeile wird der Prozentwert (einst %%b, jetzt %2)
::---- in eine numerische Variable namens %perc% kopiert.
....
goto :eof
Grüße
Biber
Moin Patrick,
zuerst: das "pause" ist an diese Stelle nicht aufführbar.
Ersatzlos streichen und dann nochmal testen.
Kurzer Versuch der Erklärung (unter "FOR /?" am CMD-Prompt besser erkärt):
Beispiel am CMD-Prompt
FOR /F-Anweisungen immer von innen nach aussen lesen...
In der runden Klammer steht das, was als "Textdatei" zeilenweise gelesen wird.
In der Klammer steht:
Ergebnis davon sind alle Zeilen, die ein Zeichen "%" enthalten.
Diese Zeilen enthalten, wenn man/frau als Delimiter, als Trennzeichen den Punkt (".") und das Leerzeichen definiert, was ich mit der Anweisung "Delims=. " tue, Pi mal Auge so 13 "Tokens", also Einzelteile.
Token Nummer#1 ist die Laufwerksbezeichnung ("C:\" oder "D:\") , Token Nummer #11 ist der Ganzzahlanteil der Frei-Prozentangabe.
Mehr isses eigentlich nicht.
Grüße
Biber
zuerst: das "pause" ist an diese Stelle nicht aufführbar.
Ersatzlos streichen und dann nochmal testen.
Kurzer Versuch der Erklärung (unter "FOR /?" am CMD-Prompt besser erkärt):
Beispiel am CMD-Prompt
for /f "tokens=1,11 delims=. " %a in ('findstr "%" d:\bat\test.txt') do @echo %a %b
FOR /F-Anweisungen immer von innen nach aussen lesen...
In der runden Klammer steht das, was als "Textdatei" zeilenweise gelesen wird.
In der Klammer steht:
findstr "%" d:\bat\test.txt
nur deshalb in einfachen Hochkomma, damit die CMD.exe "weiss", dass es eine ausführbare Anweisung ist.Ergebnis davon sind alle Zeilen, die ein Zeichen "%" enthalten.
Diese Zeilen enthalten, wenn man/frau als Delimiter, als Trennzeichen den Punkt (".") und das Leerzeichen definiert, was ich mit der Anweisung "Delims=. " tue, Pi mal Auge so 13 "Tokens", also Einzelteile.
Token Nummer#1 ist die Laufwerksbezeichnung ("C:\" oder "D:\") , Token Nummer #11 ist der Ganzzahlanteil der Frei-Prozentangabe.
Mehr isses eigentlich nicht.
Grüße
Biber
Hallo System#Schneider!
versuchen - der String " GB " (inklusive Leerzeichen) könnte ja auch eindeutig sein.
Bis alle Partitionen auch einen Namen haben, wäre noch folgende Vorgangsweise möglich:
[Edit]
Nachtrag: Die Position -5 (und nicht -6) resultiert daraus, dass bei der Übergabe an das Unterprogramm das %-Zeichen am Ende "geschluckt" wird. Richtiger wäre daher eigentlich:
[/Edit]
Grüße
bastla
Aber bei "%" tut sich einfach nichts....
Das kann ich zwar nicht nachvollziehen (bei mir macht Biber's Oneliner - mit Deinem oben geposteten Beispiel - genau, was er soll - [Edit] allerdings auch nur von der Kommandozeile [/Edit]), aber Du könntest alternativ zBfor /f "tokens=1,11 delims=. " %a in ('findstr /c:" GB " d:\bat\test.txt') do @echo %a %b
Bis alle Partitionen auch einen Namen haben, wäre noch folgende Vorgangsweise möglich:
@echo off & setlocal
for /f "delims=" %%a in ('findstr /c:" GB " d:\bat\test.txt') do call :ProcessLine "%%a"
goto :eof
:ProcessLine
set "Line=%~1"
set Drv=%Line:~4,2%
set /a Free=%Line:~-5,3%
echo %Drv% %Free%
[Edit]
Nachtrag: Die Position -5 (und nicht -6) resultiert daraus, dass bei der Übergabe an das Unterprogramm das %-Zeichen am Ende "geschluckt" wird. Richtiger wäre daher eigentlich:
@echo off & setlocal
for /f "delims=" %%a in ('findstr /c:" GB " d:\bat\test.txt') do set "Line=%%a" & call :ProcessLine
goto :eof
:ProcessLine
set Drv=%Line:~4,2%
set /a Free=%Line:~-6,3%
echo %Drv% %Free%
Grüße
bastla
Moin,
Nachtrag zur Meldung "findstr "%" funktioniert nicht im Batch".
Stimmt.
Im Batch müssten es tatsächlich zwei %-Zeichen sein:
Aber herleitbar ist das nicht - ich würde dann schon eher auf bastla's Alternative ausweichen.
[Also die Alternative mit dem genauen Suchen nach "GB" in der Hoffnung, dass nirgends nicht nur noch 20 MB oder 16 KB frei sind *gg]
Grüße
Biber
Nachtrag zur Meldung "findstr "%" funktioniert nicht im Batch".
Stimmt.
Im Batch müssten es tatsächlich zwei %-Zeichen sein:
>type proz.bat
for /f "tokens=1,11 delims=. " %%a in ('findstr "%%" Disks.log') do @echo %%a %%b
>proz
>for /F "tokens=1,11 delims=. " %a in ('findstr "%" Disks.log') do @echo %a %b
C: 48
D: 66
Aber herleitbar ist das nicht - ich würde dann schon eher auf bastla's Alternative ausweichen.
[Also die Alternative mit dem genauen Suchen nach "GB" in der Hoffnung, dass nirgends nicht nur noch 20 MB oder 16 KB frei sind *gg]
Grüße
Biber
@Biber
Ist natürlich schöner so, obwohl die Copyrightmeldung (da auf STDERR) ohnehin nur angezeigt, aber nicht ausgewertet wird.
Grüße
bastla
Ist natürlich schöner so, obwohl die Copyrightmeldung (da auf STDERR) ohnehin nur angezeigt, aber nicht ausgewertet wird.
Grüße
bastla
@bastla
Stimmt schon, stimmt schon...
Aber wir sollten doch den hoffnungsvollen Azubis wenigstens einen Oneliner mit auf den Weg geben und nicht nur einen Halfliner...
Du weißt doch, wie sehr die bekannten Namen in der IT-Branche auf Quantität achten....
War da nicht vorhin jemand mit "Wie kann ich die Dateigröße meiner gezippten Security-Patches in Excel anzeigen lassen?"
Grüße
Biber
Stimmt schon, stimmt schon...
Aber wir sollten doch den hoffnungsvollen Azubis wenigstens einen Oneliner mit auf den Weg geben und nicht nur einen Halfliner...
Du weißt doch, wie sehr die bekannten Namen in der IT-Branche auf Quantität achten....
War da nicht vorhin jemand mit "Wie kann ich die Dateigröße meiner gezippten Security-Patches in Excel anzeigen lassen?"
Grüße
Biber
Hallo System#Schneider!
Wenn es Dir genügt, die letzte Ergebniszeile (falls es mehrere geben sollte) zu speichern (und nachfolgend zu überprüfen), dann einfach:
Alternativ könntest Du mit
das erste Ergebnis in die Variable schreiben.
Grüße
bastla
Wenn es Dir genügt, die letzte Ergebniszeile (falls es mehrere geben sollte) zu speichern (und nachfolgend zu überprüfen), dann einfach:
set variable=
for /f "delims=" %%i in ('findstr "Servername" %server%') do set "variable=%%i"
if defined variable echo Gefunden in Zeile: %variable%
set variable=
for /f "delims=" %%i in ('findstr "Servername" %server%') do if not defined variable set "variable=%%i"
if defined variable echo Gefunden in Zeile: %variable%
Grüße
bastla