Недопустимая команда для получения переменной WMIC

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

Я использовал это, и это работает:

for /f "tokens=2 delims== " %%k in ('WMIC path win32_physicalmedia get serialnumber /value') do (for /f "delims = " %%l in ("%%k") do set "SerialNumber=%%l")

Однако это только последний серийный номер, и я хочу получить основной.

Если бы я использовал эту команду,

"wmic path win32_physicalmedia where tag='\\\\.\\PHYSICALDRIVE0' get serialnumber /value" 

то я получаю только нужный серийный номер.

Проблема в том, что когда я пытаюсь изменить рабочий код, я получаю сообщение об ошибке при запуске bat:

Invalid Verb.

Пытаюсь приступить к работе:

for /f "tokens=2 delims== " %%k in ('wmic path win32_physicalmedia where tag='\\\\.\\PHYSICALDRIVE0' get serialnumber /value') do (for /f "delims = " %%l in ("%%k") do set SerialNumber=%%l)

Ошибки:

Invalid Verb

Если я запускаю только:

wmic path win32_physicalmedia where tag='\\\\.\\PHYSICALDRIVE0' get serialnumber /value in CMD

Я получаю следующий вывод:

SerialNumber=     WD-WCC2E1XJADRT

Так что я знаю, что команда работает.

Даже не имеет значения, есть ли пробелы, я просто хочу, что будет после echo. Я делаю это в WINPE с поддержкой WMIC, поэтому Powershell не подходит.

Общий скрипт

@echo OFF
setlocal
for %%v in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%v:\drives.txt set w=%%v

for /f "tokens=2 delims== " %%k in ('wmic path win32_physicalmedia where tag='\\\\.\\PHYSICALDRIVE0' get serialnumber /value)') do (for /f "delims = " %%l in ("%%k") do set SerialNumber=%%l)

for /F "tokens=2" %%i in ('date /t') do set "Date=%%i"
echo %SerialNumber%,%Date% >> %w%:\drives.txt

Я думаю, экранирование знака равенства вроде ^= должно работать...

aschipfl 29.05.2019 21:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
540
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это было бы так просто в powershell. Вы можете распаковать zip для Powershell 6 (pwsh) на файловом ресурсе для winpe. https://github.com/PowerShell/PowerShell/releases/download/v6.2.1/PowerShell-6.2.1-win-x64.zip

$SerialNumber = Get-CimInstance win32_physicalmedia | 
  Where tag -Match physicaldrive0 | Select -Expand serialnumber

Вот еще один способ .bat («%» - это подстановочные знаки sql, вы должны удвоить их в файле .bat):

for /f "skip=1" %%i in ('wmic path win32_physicalmedia where "tag like '%%PHYSICALDRIVE0%%'" get serialnumber') do if not defined serialnumber set serialnumber=%%i

Да, я согласен, однако я делаю это в WINPE без поддержки Powershell. Добавление поддержки PS сделало бы WIM слишком большим.

IndigoAtaxia 29.05.2019 18:45

Если бы вы хотели, вы могли бы запустить PS 6 с общего ресурса. Это портативно.

js2010 29.05.2019 19:27
Ответ принят как подходящий

Если вы измените свою команду на это:

WMIC Path Win32_PhysicalMedia Where "Tag='\\\\.\\PHYSICALDRIVE0'" Get SerialNumber /Value

= будет защищен.

Попробуйте это так:

@Echo Off
For /F "Tokens=1*Delims= = " %%A in ('
    WMIC Path Win32_PhysicalMedia Where "Tag='\\\\.\\PHYSICALDRIVE0'" Get SerialNumber /Value 2^>Nul
') Do For %%C In (%%B) Do Set "SerialNumber=%%C"
Echo [%SerialNumber%] & Pause

Я добавил последнюю строку только для того, чтобы показать любую возвращаемую переменную и значение.

Я никогда даже не считал, что Таг = виноват. Большое спасибо!

IndigoAtaxia 29.05.2019 18:48

Тег в кавычках исправил это, однако я хотел указать, что Tokens = 1 в вашем сценарии выводит только «SerialNumber», поскольку он был до первого разделителя. Мне по-прежнему нужны токены = 2, чтобы получить фактический серийный номер для всех, кто может это использовать.

IndigoAtaxia 29.05.2019 18:54

@IndigoAtaxia: нет. tokens=1* означает наличие двух токенов. Token1 (%%A) — это то, что вы ожидаете, * — это token2 (%%B) — это «все остальное» (больше не ограничено). Полезно, когда символ-разделитель мая также является частью строки.

Stephan 29.05.2019 19:42

TBF, я также возьму на себя некоторую ответственность за ваше непонимание @IndigoAtaxia, мне нравится без необходимости менять вещи из личных предпочтений, и более правильный синтаксис - "Tokens=1,* Delims= = ". Если бы я это сделал, вы бы более четко увидели звездочку как еще один токен.

Compo 29.05.2019 22:05

Другие вопросы по теме