WMIC Query gibt unerwartete Antwort zurück?

997
dr4g1116

Entschuldigung, wenn dies wie eine Noob-Frage erscheint ... aber ich kann das nicht für mein Leben herausfinden. Ich verwende WQL, um WMI für die Dell-BIOS-Version in einer Tasksequenz in SCCM abzufragen. Diese WQL-Abfrage befindet sich unten:

select * from WIN32_BIOS where SMBIOSBIOSVersion < "1.10.5" 

Einfach genug. Dieser Schritt wird ausgeführt (und installiert die neueste Version des BIOS von Dell), wenn die Version des BIOS auf dem Computer, auf dem die Sequenz ausgeführt wird, unter der aktuellen Version 1.10.5 liegt. Lange Geschichte kurz ... der Schritt ist nicht gelaufen. Also musste ich nachforschen.

Auf dem Rechner, auf dem die Tasksequenz laufen sollte, ist die BIOS-Version 1.7.3. Ich öffne eine Eingabeaufforderung und führe Folgendes aus ...

wmic BIOS get SMBIOSBIOSVersion 

Welche gibt 1.7.3 zurück. JEDOCH ... wenn ich die WMIC-Abfrage unten starte, erhalte ich "Keine Instanzen verfügbar"

C:\>wmic BIOS where "SMBIOSBIOSVersion < '1.10.5'" get SMBIOSBIOSVersion No Instance(s) Available. 

Wenn Sie die Abfrage mit ">" anstelle von "<" ausführen, wird das gewünschte Ergebnis angezeigt.

C:\>wmic BIOS where "SMBIOSBIOSVersion > '1.10.5'" get SMBIOSBIOSVersion SMBIOSBIOSVersion 1.7.3 

Ich bin verblüfft 1.10.5 ist (eindeutig) sogar in hexadezimaler Form größer als 1.7.3 (ich habe geprüft, ob dies eine seltsame Anomalie war).

Das Entfernen der einfachen Anführungszeichen funktioniert nicht, da die Abfrage ungültig wird. (IE "SMBIOSBIOSVersion> 1.10.5")

Nochmals entschuldige ich mich, wenn dies eine Noob-Frage ist. WMI und Abfragen mit WMIC und WQL sind relativ neu. Ich brauche nicht unbedingt das richtige Skript. Ich möchte wirklich genau wissen, warum dieses Ergebnis nicht so ist, wie ich es erwartet habe.

0
Haben Sie versucht `where SMBIOSBIOSVersion <1.10.5 '(dh überhaupt keine Quotes?) DavidPostill vor 7 Jahren 0
Ja, ich habe es getan. Das meinte ich, als ich sagte: "Das Entfernen der einfachen Anführungszeichen funktioniert nicht, da die Abfrage ungültig wird." Entschuldigung, das war nicht klar. Bearbeiten - Entschuldigung, ich sehe, Sie meinten überhaupt keine Zitate. Ich habe und leider gibt es einen Fehler "Das System kann die angegebene Datei nicht finden" dr4g1116 vor 7 Jahren 0
[Win32_BIOS] (https://msdn.microsoft.com/de-de/library/aa394077 (v = vs.85) .aspx) Die SMBIOSBIOSVersion-Eigenschaft der Klasse ist eine Zeichenfolge und kein numerischer Datentyp. Die Operatoren <,>, <= und> = scheinen unerwartete Ergebnisse zu haben. Wenn jemand keine Lösung findet, füge ich dies als Antwort hinzu. CConard96 vor 7 Jahren 2
Meine Vermutung ist, dass der Vergleich eine lexikographische Sortierung verwendet, keine natürliche (numerische) Sortierung. Ich weiß nicht, wie ich das beheben kann, außer die Version selbst in einer Batch-Datei zu analysieren. DavidPostill vor 7 Jahren 3
Der interessante Teil ist, wenn ich die aktuelle BIOS-Version mit '2' vergleiche, dann funktioniert die Logik. Sogar 1.9.5 funktioniert. Sobald die mittlere Zahl auf 10 geändert wird, wird sie unberechenbar. dr4g1116 vor 7 Jahren 0
Wenn Sie die Zeichenfolge mit einer lexikalischen Sortierreihenfolge vergleichen, ist "1.0 <1.10.5 <1.7.3 <1.9.5 <2.0" DavidPostill vor 7 Jahren 2
@DavidPostill - Ich dachte mir, es war etwas in dieser Richtung. Ich konnte einfach nicht den genauen Grund für die Sortierung finden. Danke dafür. dr4g1116 vor 7 Jahren 0

1 Antwort auf die Frage

2
Ben N

Wie in den Kommentaren dargelegt, handelt es sich bei der SMBIOSBIOSVersionEigenschaft um eine Zeichenfolge. Daher werden Vergleiche nur für die Textzeichen durchgeführt. Der vom Text dargestellte numerische Wert wird nicht berücksichtigt. Zum Beispiel kann die Zeichenfolge 9würde sortieren nach 8, aber weit nach auch 10weil 1Sorten vor den größeren Ziffern. (Möglicherweise relevant: ASCII-Tabelle .)

Sie sollten Ihre Vergleiche auf dem SMBIOSMajorVersionGrundstück und SMBIOSMinorVersiongegebenenfalls vornehmen. Quelle: Win32_BIOSbei MSDN . Wenn Sie beides überprüfen müssen, macht der andBediener genau das, was Sie erwarten.

Ah gute Ressource! Vielen Dank dafür. Ich werde prüfen, ob ich die Major- und Minor-Versionen verwenden kann. Ich gehe davon aus, dass ich ... einfach sehen muss, wie genau diese Attribute bei einem Upgrade auf die neuesten Versionen betroffen sind. Angenommen, Major sollte zuerst geprüft werden, dann geringfügig. dr4g1116 vor 7 Jahren 0
Markieren Sie dies als Antwort, weil Sie genau erklärt haben, warum sich das so verhält. Vielen Dank. Mein Fehler war der Gedanke, dass der String-Vergleich "10" und nicht "1" und "0" gesehen hätte, was definitiv vor 7, 9 usw. sortieren würde. dr4g1116 vor 7 Jahren 0