2014-12-04 2 views
5

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

for /f "skip=2 tokens=2 delims=," %%a in ('wmic diskdrive get serialnumber /FORMAT:CSV') do (set harddisk=%%a) 

Назначает, что WMIC видит как серийный номер жесткого диска к переменному, проблема в том, что серийный номер возвращается, немного смещенные. В одном примере он возвращает:

3ZVT01H4

Но серийный номер на этикетке:

Z3TV104H

Кажется, как будто он принимает фактический серийный номер и реверсировать каждые два символа; я печатаю что-то неправильно или это известная (но не документированная) проблема?

Есть ли способ, которым я могу взять переменную, разделить ее на две части символов, изменить порядок всех этих символов, а затем поместить это в переменную?

ответ

4

- Кажется, как будто он принимает фактический серийный номер и реверсировать каждые два символа; я печатаю что-то неправильно или это известная (но не документированная) проблема?

Лучшее, что я могу изобразить, это apparently a bug. Мои персонажи также меняются парой, и это не ограничивается wmic. Тот же результат, если я SELECT SerialNumber FROM Win32_DiskDrive от winmgmts:\\localhost\root\cimv2 в WSH.

- Есть ли способ, которым я могу взять переменную, разбить ее на два куска символов, изменить порядок всех этих символов, а затем поместить это в переменную?

Если у вас установлен PowerShell, вы можете сделать это с помощью regexp replace. Вот пакетный сценарий, который вызывает команду PowerShell, чтобы продемонстрировать:

@echo off 
setlocal 

for /f "tokens=*" %%I in ('wmic diskdrive get serialnumber ^| findstr "[0-9]"') do (

    echo reversed: %%I 

    for /f "tokens=*" %%x in ('powershell -command "'%%I' -replace '(.)(.)','$2$1'"') do (
     set "serial=%%x" 
    ) 
) 

echo corrected: %serial% 

goto :EOF 

Я предполагаю, что это квалифицируется как duck punch. :)

На самом деле, если вы просто хотите, чтобы увидеть серийный без установки переменной, вы можете сделать это с помощью PowerShell однострочника:

powershell "gwmi win32_diskdrive | %{ $_.serialnumber -replace '(.)(.)','$2$1' }" 
4

Все, что вам нужно, это некоторые циклы и основные операции подстроки.

Я произвольно предполагаю, что число не может превышать 100 символов.

@echo off 
set "disk=3ZVT01H4" 
echo Before: %disk% 
call :swapChars disk 
echo After: %disk% 
exit /b 

:swapChars var 
setlocal enableDelayedExpansion 
set "rtn=" 
for /l %%A in (0 2 100) do (
    set /a "B=%%A+1" 
    for %%B in (!B!) do (
    if "!%~1:~%%B,1!" equ "" goto :break 
    set "rtn=!rtn!!%~1:~%%B,1!!%~1:~%%A,1!" 
) 
) 
:break 
endlocal & set "%~1=%rtn%" 
exit /b 
+0

Интересно. Я собирался предположить, что порядок символов не может быть предсказуемым, но похоже, что «wmic diskdrive get serialnumber» приводит к тому же изменению пары символов на моей машине. Наклейка: 'WMAV2FA79348' ;; WMI: 'W -DMWVAF27A3984' – rojo

0

После обновления установить ОС Windows 7 на Windows 10 у меня не было никаких проблем, если бы вы увидели, что серийный номер жесткого диска жесткого диска отображается правильно при использовании: wmic diskdrive get model,name,SerialNumber,size Итак, похоже, Microsoft решила изменить порядок отображения серийных номеров на жестком диске.

Полезная справочная информация. Если кто-то запускает команду низкого уровня ATA для получения информации с диска, каждые два символа имени модели и серийного номера хранятся в обратном порядке!Это может быть связано с тем, что называется «маленьким эндиантом», или просто потому, что ATA решила, что они должны храниться.

Смежные вопросы