Неверный глагол в переменной get WMIC

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

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

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" 

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

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

Неверный глагол.

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

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)

Ошибки:

Неверный глагол

Если я бегу просто:

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

Получаю следующий результат:

SerialNumber=     WD-WCC2E1XJADRT

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

Даже не имеет значения, внутри ли пробелы, я просто хочу, что после =. Я делаю это в 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

person IndigoAtaxia    schedule 29.05.2019    source источник
comment
Я предполагаю, что экранирование знака равенства, например ^=, должно работать ...   -  person aschipfl    schedule 29.05.2019


Ответы (2)


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

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

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

person Compo    schedule 29.05.2019
comment
Я даже не считал, что Tag = виноват. Большое спасибо! - person IndigoAtaxia; 29.05.2019
comment
Цитируемый тег исправил это, однако я хотел указать на Tokens = 1 в выводе вашего сценария только SerialNumber, поскольку он был до первого разделителя. Мне все еще нужен Tokens = 2, чтобы получить фактический серийный номер для всех, кто может его использовать. - person IndigoAtaxia; 29.05.2019
comment
@IndigoAtaxia: нет, не знаешь. tokens=1* означает, что есть два токена. Token1 (%%A) - это то, что вы ожидаете, * - это token2 (%%B) - все остальное (больше не разделено). Полезно, когда символ-разделитель может также быть частью строки. - person Stephan; 29.05.2019
comment
TBF, я также возьму на себя некоторую ответственность за ваше недоразумение @IndigoAtaxia, мне нравится без надобности менять вещи, исходя из личных предпочтений, и более правильный синтаксис - "Tokens=1,* Delims==". Если бы я сделал это, вы бы более четко увидели звездочку как еще один токен. - person Compo; 29.05.2019

В 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
person js2010    schedule 29.05.2019
comment
Да, я согласен, однако я делаю это в WINPE без поддержки Powershell. Добавление поддержки PS сделало бы WIM слишком большим. - person IndigoAtaxia; 29.05.2019
comment
Если хотите, вы можете запустить PS 6 с общей папки. Он портативный. - person js2010; 29.05.2019