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

Prozentzahl aus Textdatei via Batch auslesen und verwenden

Frage Entwicklung Batch & Shell

Mitglied: 42908

42908 (Level 1)

22.10.2007, aktualisiert 13.11.2007, 5698 Aufrufe, 19 Kommentare

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:

01.
--------------------------------------------------------------------------------------- 
02.
Servername: xxxxxxx  
03.
  
04.
Volume Type       Format     Label                      Size       Free   Free 
05.
    C: Fixed      NTFS                               8.00 GB    3.86 GB  48.3% 
06.
    D: Fixed      NTFS       Volume1                41.01 GB   27.40 GB  66.8%

--> ist jetzt ein wenig verschoben (copy&paste)
[[[--Jetzt nicht mehr dank <code>-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
Mitglied: Biber
22.10.2007 um 14:02 Uhr
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:
01.
>for /f "tokens=1,11 delims=. " %a in ('findstr "%" daddeldu.log') do @echo a[%a] b[%b] 
02.
a[C:] b[48] 
03.
a[D:] b[66]
---> 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:
01.
..... 
02.
FOR /F ....%%a in (....) DO Call :TestLowLimit %%a %%b 
03.
goto :eof 
04.
 
05.
:TestLowLimit Parm1 ist Laufwerksbuchstabe Parm2 ist Prozentzzahl ganzzahlig. 
06.
Set /a perc=%2 
07.
If %perc% GEQ 10 goto :eof 
08.
....Andernfalls 
09.
machMir den Blat mit Betreff "%date% %time% Auf Lw %1 sind nur noch %2 Prozent frei.
Grüße
Biber
Bitte warten ..
Mitglied: 42908
22.10.2007 um 14:14 Uhr
danke erst mal für die Formatierung

Also es sind mehrere Rechner aber das wird kein Problem sein, den Platten jeweils einen Namen zu geben. (Bin sowieso dabei das Netzwerk mal bisschen auf Vordermann zu bringen...)
Werde es mal so probieren wie du gesagt hast.
Sind dann a und b eigentlich Variablen, sodass ich dann eben die IF-Anweisung mit wenn b kleiner als....machen kann?


wie genau funktioniert der for befehl? komme noch nicht ganz klar damit!
Kann ich deinen Befehl 1zu1 übernehmen? ohne die zwei ausgaben natürlich...???

gruß,
patrick
Bitte warten ..
Mitglied: Biber
22.10.2007 um 14:31 Uhr
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.

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
Bitte warten ..
Mitglied: 42908
22.10.2007 um 14:35 Uhr
ok werde mir das mal noch angucken. Aber wieso kann ich den Befehl


01.
   for /f "tokens=1,11 delims=. " %a in ('findstr "%" d:\bat\test.txt') do @echo a[%a] b[%b]
nicht in einer Batch starten? Wenn ich ihn direkt über den cmd promt laufen lasse gehts. Bekomme folgende Meldung:

01.
"" d:\bat\test.txt') do @echo a[b]" ist syntaktisch an dieser Stelle nicht verar 
02.
beitbar.

Der ließt wohl nicht alles oder wie?

*edit* Wo genau muss ich zwei %-zeichen machen und wo eins? es müsste doch so aussehen oder nicht:

01.
for /f "tokens=1,11 delims=. " %%a in ('findstr "%" d:\bat\test.txt') do @echo a[%a] b[%b]
Bitte warten ..
Mitglied: Biber
22.10.2007 um 15:10 Uhr
Moin Patrick,

skizziert würde es so aussehen:

01.
.... 
02.
:: ... in einem Batch... 
03.
for /f "tokens=1,11 delims=. " %%a in ('findstr "%" daddeldu.log') do call :TestLowLimit %%a %%b 
04.
goto :eof 
05.
 
06.
:TestLowLimit ...siehe oben 
07.
Set /a perc=%2       
08.
::---- in der vorangegangenen Zeile wird der Prozentwert (einst %%b, jetzt %2)  
09.
::---- in eine numerische Variable namens %perc% kopiert. 
10.
.... 
11.
 
12.
goto :eof
Grüße
Biber
Bitte warten ..
Mitglied: 42908
22.10.2007 um 15:42 Uhr
Ich glaube die Batch hat ein Problem, wenn sie nach dem %-Zeichen suchen soll:

wenn ich folgendes ausführe tut sich nämlich gar nichts.Das Fenster springt einfach wieder weg. Auch über Kommandozeile tut sich nichts.

01.
for /f "tokens=1,11 delims=. " %%a in ('findstr "%" d:\bat\test.txt') pause do @echo %%a %%b
habe es auch so versucht

01.
for /f "tokens=1,11 delims=. " %%a in ('findstr "%" d:\bat\test.txt') pause do @echo %a %b
kein erfolg...vielleicht kannt du mir mal genau erklären was der Befehl macht.

Vielen Dank,

Patrick
Bitte warten ..
Mitglied: Biber
22.10.2007 um 16:56 Uhr
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
01.
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
Bitte warten ..
Mitglied: 42908
22.10.2007 um 18:07 Uhr
Hallo
sorry die Pause gehört da echt nicht hin....das weiß ich aber ausnahmsweiße auch mal
Hab nur falsch gepostet sorry. Es tut sich jedoch leider nix. Ich denke das könnte was mit dem findstr-Befehl zu tun haben, da wenn ich z.b. nach "free" suche mit dem Befehl sich etwas tut. Aber bei "%" tut sich einfach nichts....

gruß,
patrick
Bitte warten ..
Mitglied: bastla
22.10.2007 um 19:03 Uhr
Hallo System#Schneider!

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 zB
01.
for /f "tokens=1,11 delims=. " %a in ('findstr /c:" GB " d:\bat\test.txt') do @echo %a %b
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:
01.
@echo off & setlocal 
02.
for /f "delims=" %%a in ('findstr /c:" GB " d:\bat\test.txt') do call :ProcessLine "%%a" 
03.
goto :eof 
04.
 
05.
:ProcessLine 
06.
set "Line=%~1" 
07.
set Drv=%Line:~4,2% 
08.
set /a Free=%Line:~-5,3% 
09.
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:
01.
@echo off & setlocal 
02.
for /f "delims=" %%a in ('findstr /c:" GB " d:\bat\test.txt') do set "Line=%%a" & call :ProcessLine 
03.
goto :eof 
04.
 
05.
:ProcessLine 
06.
set Drv=%Line:~4,2% 
07.
set /a Free=%Line:~-6,3% 
08.
echo %Drv% %Free%
[/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: 42908
22.10.2007 um 19:46 Uhr
Ok danke. Werde es morgen ausprobieren.heute komme ich leider nicht mehr dazu. Aber schon mal vielen Dank.

Bis morgen
Bitte warten ..
Mitglied: Biber
22.10.2007 um 19:59 Uhr
Moin,

Nachtrag zur Meldung "findstr "%" funktioniert nicht im Batch".

Stimmt.
Im Batch müssten es tatsächlich zwei %-Zeichen sein:
01.
>type proz.bat 
02.
for /f "tokens=1,11 delims=. " %%a in ('findstr "%%" Disks.log') do @echo %%a %%b 
03.
 
04.
>proz 
05.
 
06.
>for /F "tokens=1,11 delims=. " %a in ('findstr "%" Disks.log') do @echo %a %b 
07.
C: 48 
08.
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
Bitte warten ..
Mitglied: 42908
22.10.2007 um 21:22 Uhr
:-P das hoffe ich auch nicht.

Werde mal nochmal die Log durch gucken evtl finde ich ja noch etwas wo es nur einmal in den bestimmten zeilen gibt.

Aber werde wie gesagt erst morgen eure Lösungsvorschläge probieren....wenn ich dazu komme da ich noch ein Azubi bin und in die Berufsschule muss und nicht arbeiten...

Bis dann und super vielen Dank
Bitte warten ..
Mitglied: bastla
22.10.2007 um 21:39 Uhr
Hallo System#Schneider!

Einen hab ich noch:
01.
psinfo -d | more +19 > Disks.log
Damit bleiben (zumindest bei mir) nur noch die gewünschten Zeilen über, sodass das Filtern überhaupt entfallen könnte.

Grüße
bastla
Bitte warten ..
Mitglied: Biber
22.10.2007 um 21:51 Uhr
Hmm...dann noch einen drauf:
01.
>psinfo -d 2>nul|more +19
...damit die Copyrightmeldung nicht mit ausgewertet wird.
Im ganzen Satz:
01.
for /f "tokens=1,11 delims=. " %i in ('psinfo -d ^2^>nul^|more +19') do @echo %i %j
Grüße
Biber
Bitte warten ..
Mitglied: bastla
22.10.2007 um 22:10 Uhr
@Biber
Ist natürlich schöner so, obwohl die Copyrightmeldung (da auf STDERR) ohnehin nur angezeigt, aber nicht ausgewertet wird.

Grüße
bastla
Bitte warten ..
Mitglied: Biber
22.10.2007 um 23:27 Uhr
@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
Bitte warten ..
Mitglied: 42908
25.10.2007 um 12:40 Uhr
Hallo,

also ich komme weiter....werde aber mein ergebnis erst posten, wenns auch funktioniert. Evtl auch heute schon.
Jetzt habe ich aber noch eine kleine Frage:

Kann man ein Ergebnis eines Befehls als Variable speichernß

so in etwa:
01.
set variable=findstr "Servername" %server%
Ich weiß, dass es so nicht geht. Da setzt er die Variable einfach als String wie ich ihn eingegeben habe.

Bei
01.
set variable=%cd%
zum Beispiel setzt er die Variable auf das aktuelle Verzeichnis. Ist dies auch irgendwie mit dem findstr-Befehl möglich?

Gruß,
Patrick
Bitte warten ..
Mitglied: bastla
25.10.2007 um 15:31 Uhr
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:
01.
set variable= 
02.
for /f "delims=" %%i in ('findstr "Servername" %server%') do set "variable=%%i" 
03.
if defined variable echo Gefunden in Zeile: %variable%
Alternativ könntest Du mit
01.
set variable= 
02.
for /f "delims=" %%i in ('findstr "Servername" %server%') do if not defined variable set "variable=%%i" 
03.
if defined variable echo Gefunden in Zeile: %variable%
das erste Ergebnis in die Variable schreiben.

Grüße
bastla
Bitte warten ..
Mitglied: 42908
13.11.2007 um 08:37 Uhr
Hallo sorry dass ich mich erst jetzt wieder melde...habe mein Problem folgendermaßen gelöst:

Wie schon gesagt mittels findstr-Befehl eine solche Ausgabe von PSInfo erstellt:

01.
--------------------------------------------------------------------------------------- 
02.
Di 13.11.2007  7:00:05,86  
03.
Servername: SENECA  
04.
  
05.
Volume Type       Format     Label                      Size       Free   Free 
06.
    C: Fixed      NTFS       System                  7.81 GB    1.26 GB  16.2% 
07.
    D: Fixed      NTFS       Volume1                25.39 GB    8.64 GB  34.0% 
08.
    E: Fixed      FAT32      IMAGE                   4.03 GB    1.83 GB  45.3%


Mit einer weiteren Batch habe ich nun dieses Txt-File ausgelesen:

01.
for %%a in (%server5% %server4% %server3% %server2% %server1% %server0%) do set server=%%a & call :check 
02.
 
03.
:check 
04.
for /f "tokens=1,11 delims=. " %%a in ('findstr " GB " %server%') do call :machschon %%a %%b 
05.
goto :eof 
06.
 
07.
 
08.
 
09.
:machschon 
10.
set drv=%1 
11.
set /a perc=%2 
12.
 
13.
if %perc% GEQ 10 goto :eof 
14.
 
15.
set servername= 
16.
for /f "delims=" %%i in ('findstr "Servername" %server%') do set "servername=%%i" 
17.
 
18.
 
19.
echo %date% %time%>>%achtung% 
20.
echo Achtung auf %servername% sind auf Laufwerk %drv% nur noch %perc% Prozent Speicherplatz frei!>>%achtung% 
21.
 
22.
 
23.
blat -to [e-mail adresse] -f [sende email-Adresse] -subject "ACHTUNG!!! Auf einem Rechner im Netzwerk besteht zu wenig Speicherplatz" -body "Siehe Anhang fuer naehere Infos und um welchen Rechner es sich handelt!" -Server [Interner Mailserver] -attach achtung.txt 
24.
 
25.
goto :eof

Einzelheiten kann man natürlich noch ändern. Sobald neue Rechner/Server dazu kommen muss man in der 2.Batch eine neue Variable für diesen Server/Rechner erstellen und in der ersten for-Schleife hinzufügen. Die Variblen zeigen auf die einzelnen Log-Files, die die 1. Batch erstellt hat. (Für jeden Rechner/Server eine eigene Log)

Weiterhin habe ich auch noch eine weiterlaufende Log gemacht, in die die Daten vom vorherigen Tag eingetragen werden. So kann ich immer sehen, wann sich der freie Speicherplatz geändert hat.


Gruß,

Schneider
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Per Batch Textdatei Spaltenweise auslesen nochmal weil ich dumm bin (9)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Batch & Shell
Batch Textdatei Spaltenweise auslesen (7)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Windows Systemdateien
gelöst Registry-Schlüssel per Batch auslesen und in Datei schreiben (9)

Frage von Philzip zum Thema Windows Systemdateien ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (19)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...