Вопрос или проблема
Добрый день всем,
Я ищу решение для проверки версии BIOS системы с помощью пакетного файла. В данный момент я уже ищу и тестирую 2 дня для решения.
Есть ли способ сравнить вывод команды wmic bios get smbiosbiosversion /value
с фиксированным значением, например: SMBIOSBIOSVersion=R1EET58W(1.58 )
1. Обратите внимание на пробел SPACE
перед )
, который может быть простым пробелом или непечатаемым символом…
SMBIOSBIOSVersion=R1EET58W(1.58?)
2. В случае пустого пространства, это может быть зарезервированное пространство для составления последней цифры для версии в строке R1EET58W(X,YY,z)
3. Что вы можете сделать, так это сравнить результат в | findstr "STRINGS"
, заменив символ
(непечатаемый или пробел) на .
(подстановочный знак для любого символа) и, если предопределенная версия была найдена больше “.”, тогда вы можете (в случае &&
), set "_ver=SameVersionFound"
или, если не совпало (в случае ||
), set "_ver=MoreRecentOrPreviousVersion
с предопределенной версией, найденной. Что предлагается в - Код #1
4. Вы можете использовать прямые условные операторы &&
и ||
, где, если версия, указанная в findstr
, такая же && execute ()
или если она отличается || execute ()
. Что предлагается в - Код #2
– Код #1
for /f usebackq^tokens^=4delims^=^<^> %G in (`wmic bios get smbiosbiosversion /format:xml ^|find "VALUE"`)do @echo/"%~G"|findstr "R1EET58W(1\.58.)" >nul && @set "_ver=SameVersionFound %~G" || @set "_ver=MoreRecentOrPreviousVersion %~G"
– Код #2
wmic bios get smbiosbiosversion /format:xml | find "VALUE" | findstr "R1EET58W(1\.58.)" >nul && ( set "_ver=SameVersionFound" command x... command y... ... command n... ) || ( set "_ver=MoreRecentOrPreviousVersion" command x... command y... ... command n... )
Некоторые дополнительные материалы для чтения:
wmic
возвращает множество пустых строк, которые неудобно парсить. Powershell возвращает только строку версии, поэтому вы могли бы сделать что-то подобное в пакетном файле:
for /f "delims=" %i in ('powershell -c ^(Get-CimInstance win32_bios^).SMBIOSBIOSVersion') do set biosversion=%i IF "%biosversion%"=="1.2.3" echo "BIOS OK"
или полностью на powershell:
if ((Get-CimInstance win32_bios).SMBIOSBIOSVersion -eq "1.2.3") {echo "BIOS OK"}
.
Ответ или решение
Сравнение версии BIOS с фиксированным значением является важной задачей для ИТ-специалистов, особенно в контексте управления большим количеством систем. На первый взгляд, задача кажется довольно простой, но определенные особенности и нюансы могут сделать ее сложной, особенно если речь идет о скриптах и строковых операциях в командной строке Windows.
Теория
Первоначально необходимо понимать, как работает BIOS и зачем может понадобиться его версия. BIOS (Basic Input/Output System) — это базовая система ввода-вывода, которая отвечает за инициализацию оборудования при запуске системы. Версия BIOS может иметь значение для обеспечения стабильности системы и безопасности. Например, обновления BIOS могут устранять критические уязвимости или добавлять поддержку нового оборудования. Поэтому актуально знать, какая версия BIOS установлена на вашем оборудовании, и в случае необходимости сравнить ее с эталонной или рекомендуемой версией.
Пример
В качестве примера, давайте рассмотрим, как можно реализовать сравнение версии BIOS с помощью командных файлов (batch file) и PowerShell. В вопросе предложены два кода на языке командной строки Windows, которые используют wmic
и findstr
для сравнения с данной версией R1EET58W(1.58 )
. Проблема в исходной версии команды заключается в необходимости учета пробелов и возможных непечатных символов внутри строки версии.
Код #1 использует for
цикл для извлечения данных из wmic
с последующим использованием findstr
для сравнения:
for /f usebackq^tokens^=4delims^=^<^> %G in (`wmic bios get smbiosbiosversion /format:xml ^|find "VALUE"`)do @echo/"%~G"|findstr "R1EET58W(1\.58.)" >nul && @set "_ver=SameVersionFound %~G" || @set "_ver=MoreRecentOrPreviousVersion %~G"
Код #2 предлагает более прямолинейное использование условных операторов &&
и ||
, что упрощает чтение и понимание:
wmic bios get smbiosbiosversion /format:xml | find "VALUE" | findstr "R1EET58W(1\.58.)" >nul && (
set "_ver=SameVersionFound"
command x...
command y...
...
command n...
) || (
set "_ver=MoreRecentOrPreviousVersion"
command x...
command y...
...
command n...
)
Применение
На практике использование командной строки и PowerShell для управления системами является стандартной процедурой. Однако wmic
может возвращать большое количество пустых строк, что вызывает сложности при парсинге. В более современных системах может быть предпочтительнее использовать PowerShell, который предлагает более лаконичные команды для извлечения информации о BIOS. Пример команд на PowerShell:
Командный файл с вызовом PowerShell:
for /f "delims=" %i in ('powershell -c ^(Get-CimInstance win32_bios^).SMBIOSBIOSVersion') do set biosversion=%i
IF "%biosversion%"=="1.2.3" echo "BIOS OK"
Полностью на PowerShell:
if ((Get-CimInstance win32_bios).SMBIOSBIOSVersion -eq "1.2.3") {echo "BIOS OK"}
Использование PowerShell предпочтительно для более современных и гибких решений, так как он поддерживает объекты, потоки данных и более сложные логические условия.
В результате, зная методологию сравнения версий BIOS, вы можете более эффективно управлять своим аппаратным парком, обеспечивая актуальность и безопасность ваших систем. Важно учесть все особенности техники, такие как пробелы и непечатные символы, и выбирать инструменты, которые наилучшим образом соответствуют вашим задачам и контексту.