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

batch if Vergleich eines Prozent-Wertes

Frage Entwicklung Batch & Shell

Mitglied: joni2000de

joni2000de (Level 1) - Jetzt verbinden

14.08.2009, aktualisiert 12:29 Uhr, 7107 Aufrufe, 14 Kommentare

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
Mitglied: miniversum
14.08.2009 um 12:34 Uhr
Ungetestet und ins Blaue hinein würd ich sagen versuchs mal mit dieser Zeile bei der Angabe des Vergleichswerts:
set Vergleichswert2=5^%
Bitte warten ..
Mitglied: joni2000de
14.08.2009 um 12:44 Uhr
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
Bitte warten ..
Mitglied: miniversum
14.08.2009 um 13:42 Uhr
Schalte mach echo on bzw. lass echo off weg und schau dir an was an der Stelle interpretiert wird.
Bitte warten ..
Mitglied: joni2000de
14.08.2009 um 13:51 Uhr
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.
Bitte warten ..
Mitglied: Biber
14.08.2009 um 14:19 Uhr
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.
01.
set "Vergleichswert1=%date%" 
02.
set "Vergleichswert2=5" 
03.
 
04.
for /f "usebackq tokens=1,2,3,8,9 delims=;," %%a in ("%Auslesewert%") do ( 
05.
if "%%a" EQU "%Vergleichswert1%" ( 
06.
if "%%e" LSS "%Vergleichswert2%" echo %%a %%b %%c %%d %%e >> %Protokolldatei% 
07.
08.
)
[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
Bitte warten ..
Mitglied: joni2000de
14.08.2009 um 14:39 Uhr
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
Bitte warten ..
Mitglied: bastla
14.08.2009 um 16:42 Uhr
Hallo joni2000de!

Versuch es damit:
01.
setlocal enabledelayedexpansion 
02.
set "Vergleichswert1=%date%" 
03.
::Angabe des Prozentwertes * 100 
04.
set /a "Vergleichswert2=500" 
05.
 
06.
for /f "usebackq tokens=1,2,3,8,9 delims=;" %%a in ("%Auslesewert%") do ( 
07.
    if "%%a" EQU "%Vergleichswert1%" ( 
08.
        set "Frei=%%e" 
09.
        set "Frei=!Frei:%%=!" 
10.
        set /a "Frei=!Frei:,=!" 
11.
        if !Frei! LSS %Vergleichswert2% >>%Protokolldatei %echo %%a %%b %%c %%d %%e 
12.
13.
)
Grüße
bastla
Bitte warten ..
Mitglied: joni2000de
14.08.2009 um 17:01 Uhr
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

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

Gruß Joni
Bitte warten ..
Mitglied: bastla
14.08.2009 um 17:13 Uhr
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 ) 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
Bitte warten ..
Mitglied: Biber
14.08.2009 um 17:13 Uhr
So, Joni2000de,

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

01.
set "Vergleichswert1=%date%" 
02.
:: Vergleichswert belasse ich in dem Ur-Format "5", aber ohne %-Zeichen. 
03.
set /a "Vergleichswert2=5" 
04.
 
05.
for /f "usebackq tokens=1,2,3,8,9 delims=;" %%a in ("%Auslesewert%") do ( 
06.
   for /f "delims=,%" %%x in ("%%e") 
07.
    if "%%a" EQU "%Vergleichswert1%" ( 
08.
        if "%%x"  LSS "%Vergleichswert2%" >>%Protokolldatei %echo %%a %%b %%c %%d %%e 
09.
10.
))
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... [/Edit]
Bitte warten ..
Mitglied: bastla
14.08.2009 um 17:15 Uhr
@Biber
Ist natürlich die schönere Lösung, aber "schlanker" hätte eigentlich ohnehin nicht zu mir gepasst ...

Getestet sähe es dann etwa so aus:
01.
set "Vergleichswert1=%date%" 
02.
:: Vergleichswert belasse ich in dem Ur-Format "5", aber ohne %-Zeichen. 
03.
set /a "Vergleichswert2=5" 
04.
 
05.
for /f "usebackq tokens=1,2,3,8,9 delims=;" %%a in ("%Auslesewert%") do ( 
06.
    if "%%a" EQU "%Vergleichswert1%" ( 
07.
        for /f "delims=,%%" %%x in ("%%e") do ( 
08.
            if %%x LSS %Vergleichswert2% echo %%a %%b %%c %%d %%e 
09.
10.
11.
)
Schönes Wochenende
bastla
Bitte warten ..
Mitglied: joni2000de
14.08.2009 um 17:38 Uhr
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

Schöne Grüße
Joni
Bitte warten ..
Mitglied: pieh-ejdsch
15.08.2009 um 05:13 Uhr
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
Bitte warten ..
Mitglied: Biber
15.08.2009 um 08:41 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (11)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (18)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

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 ...