Я пытаюсь получить только серийный номер основного жесткого диска в переменную, которая будет изменена позже.
Я использовал это, и это работает:
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
Это было бы так просто в 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 слишком большим.
Если бы вы хотели, вы могли бы запустить PS 6 с общего ресурса. Это портативно.
Если вы измените свою команду на это:
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
Я добавил последнюю строку только для того, чтобы показать любую возвращаемую переменную и значение.
Я никогда даже не считал, что Таг = виноват. Большое спасибо!
Тег в кавычках исправил это, однако я хотел указать, что Tokens = 1 в вашем сценарии выводит только «SerialNumber», поскольку он был до первого разделителя. Мне по-прежнему нужны токены = 2, чтобы получить фактический серийный номер для всех, кто может это использовать.
@IndigoAtaxia: нет. tokens=1*
означает наличие двух токенов. Token1 (%%A
) — это то, что вы ожидаете, *
— это token2 (%%B
) — это «все остальное» (больше не ограничено). Полезно, когда символ-разделитель мая также является частью строки.
TBF, я также возьму на себя некоторую ответственность за ваше непонимание @IndigoAtaxia, мне нравится без необходимости менять вещи из личных предпочтений, и более правильный синтаксис - "Tokens=1,* Delims= = "
. Если бы я это сделал, вы бы более четко увидели звездочку как еще один токен.
Я думаю, экранирование знака равенства вроде
^=
должно работать...