WMIC返回奇数序列号

时间:2014-12-04 15:09:10

标签: batch-file scripting wmic

我有一个奇怪的问题。我试图将WMIC中的硬盘序列号返回到批处理文件中的变量;给我变量的行是:

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

这将wmic视为硬盘驱动器的序列号分配给变量,问题是它返回的序列号稍微关闭。在一个例子中,它返回:

3ZVT01H4

但标签上的序列号是:

Z3TV104H

似乎它正在采用实际的序列号并反转每两个字符;我输错了什么,或者这是一个已知的(但没有记录在任何地方)的问题?

有没有办法让我可以获取变量,将其拆分为两个字符块,颠倒所有这些字符的顺序,然后将其放入变量?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

- 似乎它正在采用实际的序列号并反转每两个字符;我输错了什么,或者这是一个已知的(但没有记录在案的地方)问题?

我能算得最好,它是apparently a bug。我的角色也被对反转,并且它不仅限于wmic。如果我SELECT SerialNumber FROM Win32_DiskDrive来自WSH中的winmgmts:\\localhost\root\cimv2,那么结果相同。

- 有没有办法让我可以把变量分成两个字符块,颠倒所有这些字符的顺序,然后把它放到变量中?

如果安装了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' }"

答案 2 :(得分:0)

将Windows 7操作系统安装升级到Windows 10后,我在使用时看到WD驱动器的硬盘序列号正确显示没有任何问题:wmic diskdrive get model,name,SerialNumber,size所以看来微软决定改变物理磁盘驱动器的串行方式数字显示。

一些有用的背景信息:如果有人运行低级ATA命令从磁盘驱动器获取信息,则型号名称和序列号的每两个字符实际上以相反的顺序存储!这可能与所谓的“小端”有关。或者它只是ATA决定如何存储它们。