WMIC返回奇数序列号

ITG*_*evi 5 scripting batch-file wmic

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

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

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

3ZVT01H4

但标签上的序列号是:

Z3TV104H

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

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

roj*_*ojo 5

-- 好像是取了实际的序列号,每两个字符颠倒一次;我打错了什么还是这是一个已知的(但没有记录在任何地方)问题?

尽我所能,这显然是一个错误。我的字符也是成对反转的,而且不仅限于 wmic。如果我SELECT SerialNumber FROM Win32_DiskDrive来自winmgmts:\\localhost\root\cimv2WSH,结果相同。

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

如果您安装了 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
Run Code Online (Sandbox Code Playgroud)

我想这符合鸭子拳:)

实际上,如果您只想在不设置变量的情况下查看串行,则可以使用 PowerShell one-liner 执行此操作:

powershell "gwmi win32_diskdrive | %{ $_.serialnumber -replace '(.)(.)','$2$1' }"
Run Code Online (Sandbox Code Playgroud)