我有一个奇怪的问题。我试图将WMIC中的硬盘序列号返回到批处理文件中的变量;给我变量的行是:
for /f "skip=2 tokens=2 delims=," %%a in ('wmic diskdrive get serialnumber /FORMAT:CSV') do (set harddisk=%%a)
这将wmic视为硬盘驱动器的序列号分配给变量,问题是它返回的序列号稍微关闭。在一个例子中,它返回:
3ZVT01H4
但标签上的序列号是:
Z3TV104H
似乎它正在采用实际的序列号并反转每两个字符;我输错了什么,或者这是一个已知的(但没有记录在任何地方)的问题?
有没有办法让我可以获取变量,将其拆分为两个字符块,颠倒所有这些字符的顺序,然后将其放入变量?
答案 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决定如何存储它们。