joni2000de
Goto Top

batch if Vergleich eines Prozent-Wertes

Hallo Admins,

ich hab da mal ne Frage.

Wie kann ich in einem batch mit einer if-Abfrage %-Werte vergleichen?

set Vergleichswert1=%date%
set Vergleichswert2=5%

for /f "usebackq tokens=1,2,3,8,9 delims=;" %%a in ("%Auslesewert%") do (
if "%%a" EQU "%Vergleichswert1%" (
if "%%e" LSS "%Vergleichswert2%" echo %%a %%b %%c %%d %%e >> %Protokolldatei%
)
)

Der Wert %%e ist der Füllgrad einer Partition der in % angegeben wird (z. B. 11,32%). Jetzt möchte ich, dass alle Zeilen bei denen der Füllgrad kleiner als der angegebenen Vergleichswert (hier 5%) ist in die Protokolldatei geschrieben werden. Wenn ich das mit dem freien Platz in GB mache funktioniert das problemlos, doch ich möchte den Prozentanteil auswerten (auch 5,00% funktioniert nicht).

Bin für jeden Tipp dankbar.

Gruß Joni

Content-Key: 122759

Url: https://administrator.de/contentid/122759

Printed on: April 19, 2024 at 08:04 o'clock

Member: miniversum
miniversum Aug 14, 2009 at 10:34:04 (UTC)
Goto Top
Ungetestet und ins Blaue hinein würd ich sagen versuchs mal mit dieser Zeile bei der Angabe des Vergleichswerts:
set Vergleichswert2=5^%
Member: joni2000de
joni2000de Aug 14, 2009 at 10:44:27 (UTC)
Goto Top
Das ^% hat den Effekt, dass die nächste Zeile direkt hinter diese Zeile angehängt wird (sozusagen ein negativer Zeilenumbruch). Kann vielleicht auch mal ganz hilfreich sein, doch mein Problem ist damit leider nicht gelöst.

Gruß Joni
Member: miniversum
miniversum Aug 14, 2009 at 11:42:35 (UTC)
Goto Top
Schalte mach echo on bzw. lass echo off weg und schau dir an was an der Stelle interpretiert wird.
Member: joni2000de
joni2000de Aug 14, 2009 at 11:51:24 (UTC)
Goto Top
Das habe ich schon gemacht. Es wird keine besondere Meldung ausgegeben. Es werden alle Zeilen in die Protokolldatei geschrieben die der ersten Vergleichsabfrage (Datum) entsprechen, egal wie hoch der angegebenen Prozentsatz ist. D. h. es wird 4,73% < 5% ebenso als wahr angenommen wie 73,28% < 5%. Wie gesagt beim Vergleich der GB funktioniert die Abfrage einwandfrei, da stehen nur Zahlen drin ohne %. Die Werte werden auch mit xx,xx% ausgegeben.
Member: Biber
Biber Aug 14, 2009 at 12:19:35 (UTC)
Goto Top
Moin joni2000de,

Du kannst im Batch bestenfalls ganzzahlige Werte (und die auch nur bis zum Wert 32767) als Zahlenwerte miteinander und mit LSS, GTR, GEQ...etc vergleichen.
Alles, was nicht als Ganzzahl "erkannt" wird von der CMD.exe wird eben als Text verglichen.

Also vergleiche Ganzzahlen.
set "Vergleichswert1=%date%"  
set "Vergleichswert2=5"  

for /f "usebackq tokens=1,2,3,8,9 delims=;," %%a in ("%Auslesewert%") do (  
if "%%a" EQU "%Vergleichswert1%" (  
if "%%e" LSS "%Vergleichswert2%" echo %%a %%b %%c %%d %%e >> %Protokolldatei%  
)
)
[delims=Komma hinzugefügt und das %-Zeichen hinter den 5% rausgenommen]

Ungetestet, und so funktioniert es auch nur, wenn die Tokens in %%b, %%c und %%d nicht ein Komma enthalten.

Ich versteh nicht, warum Du nicht ein oder zwei Beispielzeilen Deiner "%Auslesewert%-Ausgabe bereitstellst.

Grüße
Biber
Member: joni2000de
joni2000de Aug 14, 2009 at 12:39:14 (UTC)
Goto Top
Hallo Biber,

hier die Zeilen aus %Auslesewerte%.

Datum;Host;LW;FS;Total;used;usedP;free;freeP
14.08.2009;db01.ko.loc;C:;NTFS;16,10;12,23;76,01%;3,86;23,99%
14.08.2009;db01.ko.loc;D:;NTFS;32,21;18,66;57,94%;13,55;42,06%
14.08.2009;db01.ko.loc;E:;NTFS;32,21;13,46;41,78%;18,75;58,22%
14.08.2009;db02.ko.loc;C:;NTFS;16,10;9,52;59,13%;6,58;40,87%
14.08.2009;db02.ko.loc;D:;NTFS;10,73;1,48;13,83%;9,25;86,17%
14.08.2009;db02.ko.loc;E:;NTFS;26,84;0,92;3,43%;25,92;96,57%
14.08.2009;db02.ko.loc;F:;NTFS;80,53;0,55;0,68%;79,98;99,32%

Ausgelesen wird Datum, Host, LW, free (freier Platz), freeP (Prozentanteil des freien Platzes)

Wie du siehst viele Werte mit Komma. Wenn ein batch nur ganze Zahlen vergleichen kann, werden dann bei den GB das Komma und die Stellen dahinter einfach ignoriert? Da funktioniert es nämlich.

Falls das nicht geht mit % wie könnte ich das dann umgehen? Auf die Stellen hinter dem Komma soll es mir ja nicht drauf ankommen. Wenn aus 23,99% 23 wird und ich das dann vergleichen kann ist das auch ok, ins Protokoll wird dann ja trotzdem der genaue Wert geschrieben.

Gruß Joni
Member: bastla
bastla Aug 14, 2009 at 14:42:48 (UTC)
Goto Top
Hallo joni2000de!

Versuch es damit:
setlocal enabledelayedexpansion
set "Vergleichswert1=%date%"  
::Angabe des Prozentwertes * 100
set /a "Vergleichswert2=500"  

for /f "usebackq tokens=1,2,3,8,9 delims=;" %%a in ("%Auslesewert%") do (  
    if "%%a" EQU "%Vergleichswert1%" (  
        set "Frei=%%e"  
        set "Frei=!Frei:%%=!"  
        set /a "Frei=!Frei:,=!"  
        if !Frei! LSS %Vergleichswert2% >>%Protokolldatei %echo %%a %%b %%c %%d %%e
    )
)
Grüße
bastla
Member: joni2000de
joni2000de Aug 14, 2009 at 15:01:47 (UTC)
Goto Top
Hallo bastla,

funktioniert tadellos, genau so wie ich es wollte. Nur ein Problem, ich kann dem nur teilweise folgen. Falls du Zeit und Lust hast wäre ich für eine Info zum Code noch dankbar. Ich will ja auch was lernen und nicht nur abschreiben face-wink

Jetzt bin ich meinem Ziel auf jeden Fall schon ein großes Stück näher.

Gruß Joni
Member: bastla
bastla Aug 14, 2009 at 15:13:38 (UTC)
Goto Top
Hallo joni2000de!

Da, wie Biber es schon beschrieben hat, ein Vergleich mit Zahlenwerten nur beschränkt möglich ist, wird einfach der jeweilige Prozentwert in einen "brauchbaren" Wertebereich gebracht, indem
  • in Zeile 8 eine "gewöhnliche" Variable %Frei% erzeugt wird (mit den Laufvariablen, wie zB %%e, sind die folgenden Schritte nicht möglich),
  • in Zeile 9 alle (auch wenn's nur eines sein sollte face-wink) enthaltenen Prozentzeichen aus %Frei% durch Nichts ersetzt werden (wie immer innerhalb eines Batches müssen dazu die Prozentzeichen doppelt angeschrieben werden, siehe zB auch %%e),
  • in Zeile 10 das Selbe mit dem Komma gemacht und gleich ein numerischer Wert (durch das "/a") erzeugt wird und
  • in Zeile 11 schließlich der gewünschte (numerische) Vergleich stattfindet.

Zu erwähnen wäre nur noch "setlocal enabledelayedexpansion": Dadurch wird es möglich, innerhalb der Schleife bereits auf die neuen (geänderten) Werte der Variablen %Frei% zuzugreifen - allerdings muss dazu diese Variable !Frei! geschrieben werden.

Grüße
bastla
Member: Biber
Biber Aug 14, 2009 at 15:13:46 (UTC)
Goto Top
So, Joni2000de,

dann auch noch meine Variante, der Vollständigkeit halber.

set "Vergleichswert1=%date%"  
:: Vergleichswert belasse ich in dem Ur-Format "5", aber ohne %-Zeichen. 
set /a "Vergleichswert2=5"  

for /f "usebackq tokens=1,2,3,8,9 delims=;" %%a in ("%Auslesewert%") do (  
   for /f "delims=,%" %%x in ("%%e")  
    if "%%a" EQU "%Vergleichswert1%" (  
        if "%%x"  LSS "%Vergleichswert2%" >>%Protokolldatei %echo %%a %%b %%c %%d %%e  
    )
))
Is' n bisschen schlanker, aber dafür ungetestet.

Grüße und schönes & baldiges Wochenende an Euch beide
Biber


[Edit]..es mag ja etwas geben, das schlanker ist als bastla, aber niemand überholt schneller... face-wink [/Edit]
Member: bastla
bastla Aug 14, 2009 at 15:15:50 (UTC)
Goto Top
@Biber
Ist natürlich die schönere Lösung, aber "schlanker" hätte eigentlich ohnehin nicht zu mir gepasst ... face-wink

Getestet sähe es dann etwa so aus:
set "Vergleichswert1=%date%"  
:: Vergleichswert belasse ich in dem Ur-Format "5", aber ohne %-Zeichen. 
set /a "Vergleichswert2=5"  

for /f "usebackq tokens=1,2,3,8,9 delims=;" %%a in ("%Auslesewert%") do (  
    if "%%a" EQU "%Vergleichswert1%" (  
        for /f "delims=,%%" %%x in ("%%e") do (  
            if %%x LSS %Vergleichswert2% echo %%a %%b %%c %%d %%e
        )
    )
)
Schönes Wochenende
bastla
Member: joni2000de
joni2000de Aug 14, 2009 at 15:38:07 (UTC)
Goto Top
Hallo ihr beiden,

da habe ich heute mal wieder mächtig was dazu gelernt!

Dank eurer Hilfe kann ich mich jetzt beruhigt aufs Bike setzen statt vor den PC face-wink

Schöne Grüße
Joni
Member: pieh-ejdsch
pieh-ejdsch Aug 15, 2009 at 03:13:09 (UTC)
Goto Top
hallo Biber,

Du bringst mich da ausm Konzept - Irgendwie ;
[OT]
ich bin ja immer, für noch was fürs Variablentut, zu haben
da hatte ich an folgendes gedacht:

* Die CMD kann auch nichts mit Zahlen größer 2.147.483.647 anfangen. Darübergehende Zahlen also von 2.147.483.648 bis zur Zahl 4.294.967.294 werden in die Numerische Variable als Negative Zahl von -2.147.483.648 bis -2 festgelegt. Ab der Zahl 4.294.967.294 gibt Dir die CMD eine Fehlermeldung aus. Für die Nagativen Zahlen gilt der Satz entsprechend mit Umgekehrter Bedeutung.
[/OT]
und da behaupte sag ich einfach mal das LSS noch richtig vergleicht und zwar wenn die erste Vergleichszahl egal wie groß und die zweite Vergleichszahl höchstens 2.147.483.647 ist.
Und die restlichen VergleichsOP bei beiden Vergleichszahlen bis zu der (2 hoch 31) -1 korrekt arbeiten.
ist zur lesbarkeit mit T-punkten versehen...

Gruß Phil
Member: Biber
Biber Aug 15, 2009 at 06:41:33 (UTC)
Goto Top
Moin PH,

klar, Du hast vollkommen Recht.
Da war ich gestern gerade mal im ganz falschen Film - hat vermutlich etwas mit Freitag nachmittag zu tun.

Richtig (und für diesen Thread relevant) war das "CMD.exe kann nur ganzzahlig rechnen".

Vollkommen Quark war die von mir angeführte unsigned smallint -Restriktion von 0...32767.
Die gilt am CMD bei der dynamischen %random%-Variablen.

Rechnen kann die CMD.exe wie von Dir gepostet bis (2 hoch 31)-1.

Danke für die Richtigstellung.

Grüße
Biber