Вопрос или проблема
Мне нужно запустить этот скрипт, который я сделал. Этот пакет должен скопировать скомпилированную программу на STM32 Nucleo. Он использует wmic
для поиска буквы виртуального диска Nucleo по его метке:
@echo off
for /f %%D in ('wmic volume get DriveLetter^, Label ^| find "NODE_F446RE"') do set nucleo_drive=%%D
IF EXIST %D%\DETAILS.TXT (
IF EXIST main.bin (
@echo on
xcopy main.bin %D%
@echo off
echo Copied main.bin on nucleo
) ELSE (
echo Binary not found. Run `mingw32-make` in this directory to compile the project.
)
) ELSE (
echo Nucleo drive not found. If needed, edit the `find "NODE_F446RE"` part of this script to refference your nucleo volume name.
)
Но я получаю эту ошибку:
'wmic' is not recognized as an internal or external command, operable program or batch file.
Я удостоверился, что служба Windows Management Instrumentation запущена. Что еще может быть неправильно?
WMIC устарел и отсутствует по умолчанию в Windows 11. Предпочтительно использовать командлет PowerShell Get-WmiObject
, или, если нет необходимости использовать WMI, использовать специфические командлеты управления (например, Get-LocalUser
).
На момент написания (23H2) WMIC все еще доступен как необязательная функция. В приложении “Настройки” перейдите в Система → Дополнительные функции и нажмите “Просмотр функций” в строке “Добавить дополнительную функцию”. Отметьте флажок для WMIC и продолжите установку.
Если функция уже установлена или вы используете более старую версию ОС, эта ошибка указывает на то, что директория утилиты wmic
не найдена в вашем PATH
. Откройте окно расширенных свойств системы (вы можете открыть страницу “Система” с помощью Windows+Pause/Break) и на вкладке “Дополнительно” нажмите “Переменные среды”. В секции системных переменных найдите PATH
(или любую другую вариацию написания). Добавьте в нее следующую запись:
%SystemRoot%\System32\Wbem
Обратите внимание, что записи разделяются точкой с запятой.
Как сказал @DavidWheatley, wmic
теперь удален, не только из последних версий для инсайдеров, но и из последних релизов.
Используя WMI команды PowerShell, информация, необходимая @TomášZato, доступна через:
Get-WmiObject -Class Win32_Volume | fl DriveLetter, Label
И вот как получить серийный номер BIOS, что я искал, когда нашел этот ответ:
Get-WmiObject -Class Win32_Bios | Select SerialNumber
Чтобы сократить набор текста, -Class
можно опустить в обоих приведенных выше случаях; и команды, и члены данных не чувствительны к регистру, так что можно ввести все в нижнем регистре, например get-wmiobject win32_bios | select serialnumber
.
Если вы используете Windows 11, Microsoft удалила WMIC из последних версий для инсайдеров.
Вместо этого теперь следует использовать команды PowerShell.
Чтобы перечислить все команды WMI PowerShell, вы можете выполнить Get-Command -Noun WMI*
.
В моем случае, у меня уже стояла %SystemRoot%\System32\Wbem
в пути, но недавно установленный драйвер устройства USB дополнительно добавил C:\Windows\System32
в конец моего пути, и это помешало Windows найти команду wmic. Когда я удалил завершающую C:\Windows\System32
из пути, wmic снова стал находиться.
Когда я использовал C:\Windows\System32
в пути, я получал такое же предупреждение при установке операционной системы Tails на USB-накопитель.
Когда я изменил это на: %SystemRoot%\System32\Wbem
, все наладилось, и предупреждение исчезло.
Ответ или решение
Если вы сталкиваетесь с ошибкой "’wmic’ не является внутренней или внешней командой, исполняемой программой или пакетным файлом", это может быть связано с несколькими причинами, особенно если вы используете Windows 11.
Причина ошибки
-
Отсутствие WMIC в Windows 11: Начиная с последних сборок Windows 11, Microsoft удалила утилиту WMIC по умолчанию. Это может вызывать ошибку, даже если WMI-сервис работает.
-
Проблемы с переменной PATH: Если вы находитесь на более ранней версии Windows, проблема может возникнуть из-за отсутствия правильной настройки переменной PATH.
Решения
1. Использование PowerShell вместо WMIC
Вместо использования wmic
, который уже устарел и не поддерживается в Windows 11, вы можете использовать командлеты PowerShell, такие как Get-WmiObject
.
Пример команды для получения буквы и метки диска:
Get-WmiObject -Class Win32_Volume | Where-Object {$_.Label -eq "NODE_F446RE"} | Select-Object DriveLetter
Этот подход позволяет избежать использования устаревших инструментов и воспользоваться более современными возможностями PowerShell.
2. Настройка переменной PATH
Если вы используете более раннюю версию Windows, убедитесь, что путь к wmic.exe
включен в переменную окружения PATH. Для этого:
- Перейдите в свойства системы (вы можете открыть их, нажав
Windows + Pause/Break
). - В разделе "Дополнительно" выберите "Переменные среды".
- В системных переменных найдите
PATH
и добавьте%SystemRoot%\System32\Wbem
. - Убедитесь, что нет дублирующих записей, таких как
C:\Windows\System32
в конце PATH.
Дополнительные рекомендации
-
Модернизация кода: Поскольку WMIC устарел, рекомендуется переписать ваши сценарии на PowerShell. Это не только сделает ваш код более современным, но и обеспечит его совместимость с будущими версиями Windows.
-
Документация и обновления: Регулярно проверяйте документацию Microsoft на предмет изменений в управлении системами и управлениями серверами Windows.
Заключение
Переход на использование PowerShell вместо WMIC является обязательным шагом для поддержания актуальности и надежности ваших сценариев. Тщательно проверьте системные переменные и обновите скрипты, чтобы избежать сбоев в работе, связанных с удалением устаревших инструментов.
Следуя этим проектам, вы значительно снизите риски появления подобных ошибок в будущем и оптимизируете автоматизацию в вашей работе с устройствами и системами Windows.