WMIC Query возвращает неожиданный ответ?

858
dr4g1116

Извиняюсь, если это кажется вопросом нуба ... но я не могу понять это для моей жизни. Я использую WQL для запроса WMI о версии Dell BIOS в последовательности задач в SCCM. Это WQL Query ниже:

select * from WIN32_BIOS where SMBIOSBIOSVersion < "1.10.5" 

Достаточно просто. Этот шаг запустится (и установит последнюю версию BIOS Dell), если версия BIOS на компьютере, на котором выполняется последовательность, меньше текущей версии, 1.10.5. Короче говоря ... шаг не бежал. Итак, я приступил к расследованию.

На машине, на которой должна была выполняться последовательность задач, версия BIOS 1.7.3. Я открываю командную строку и запускаю следующее ...

wmic BIOS get SMBIOSBIOSVersion 

Который возвращает 1.7.3. ОДНАКО ... когда я запускаю запрос WMIC ниже, я получаю "Нет доступных экземпляров"

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

Выполнение запроса с «>» вместо «<» дает желаемый результат.

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

Я в тупике. 1.10.5 больше, чем 1.7.3 (ясно) даже в шестнадцатеричной форме (я проверил на случай, если это была какая-то странная аномалия).

Удаление одинарных кавычек не работает, так как запрос становится недействительным. (IE "SMBIOSBIOSVersion> 1.10.5")

Опять же, мои извинения, если это нубский вопрос. Я довольно новичок в WMI и делаю запросы с использованием WMIC и WQL. Мне не обязательно нужен правильный сценарий. Я действительно хочу точно знать, почему этот результат не так, как я ожидал.

0
Вы пробовали `где SMBIOSBIOSVersion <1.10.5` (т.е. вообще без кавычек? DavidPostill 7 лет назад 0
Да, сэр, я сделал. Именно это я и имел в виду, когда говорил «удаление одинарных кавычек не работает, так как запрос становится недействительным». Извинения, которые не были ясны. Изменить - извините, я вижу, вы имели в виду не кавычки вообще. Я сделал и, к сожалению, что возвращает ошибку "Система не может найти указанный файл" dr4g1116 7 лет назад 0
Свойство класса [Win32_BIOS] (https://msdn.microsoft.com/en-us/library/aa394077 (v = vs.85) .aspx) SMBIOSBIOSVersion является строкой, а не числовым типом данных. Похоже, операторы <,>, <= и> = имеют неожиданные результаты. Если кто-то не придумает обходного пути, я добавлю это как ответ. CConard96 7 лет назад 2
Я предполагаю, что сравнение использует лексикографическую сортировку, а не естественную (числовую) сортировку. Я не знаю, как это исправить, кроме самостоятельного анализа версии в командном файле. DavidPostill 7 лет назад 3
Интересно, что если я сравниваю текущую версию BIOS с «2», то логика работает. Даже 1.9.5 работает. Как только среднее число меняется на 10 ... оно становится шатким. dr4g1116 7 лет назад 0
Если вы сравниваете строку с лексическим порядком сортировки, то `1.0 <1.10.5 <1.7.3 <1.9.5 <2.0` DavidPostill 7 лет назад 2
@DavidPostill - я подумал, что это что-то в этом роде. Я просто не мог найти ТОЧНУЮ причину того, как это было отсортировано. Спасибо за это. dr4g1116 7 лет назад 0

1 ответ на вопрос

2
Ben N

Как указано в комментариях, SMBIOSBIOSVersionсвойство является строкой. Поэтому сравнения выполняются только по текстовым символам; числовое значение, представленное текстом, не учитывается. Например, строка 9будет сортировать после 8, но также и после, 10потому что 1сортирует перед большими цифрами. (Возможно, актуально: таблица ASCII .)

Вы должны сделать свои сравнения на SMBIOSMajorVersionимущество и SMBIOSMinorVersion, если необходимо. Источник: Win32_BIOSна MSDN . Если вам в конечном итоге понадобится проверить оба, andоператор сделает именно то, что вы ожидаете.

Ах, хороший ресурс! Спасибо вам большое за это. Я проверю, могу ли я использовать версии Major и Minor. Я предполагаю, что я могу ... просто нужно посмотреть, как именно эти атрибуты будут затронуты при обновлении до последней версии. Предполагается, что сначала нужно проверить майора, а затем минора. dr4g1116 7 лет назад 0
Отметив это как ответ, потому что вы точно объяснили, почему это так себя ведет. Спасибо. Я ошибался, полагая, что при сравнении строк было бы «10», а не «1» и «0», которые определенно сортировались бы до 7, 9 и т. Д. dr4g1116 7 лет назад 0

Похожие вопросы