Batch file WMIC返回奇数序列号
我有个奇怪的问题。我试图将硬盘序列号从WMIC返回到批处理文件中的变量;给出变量的行是:Batch file WMIC返回奇数序列号,batch-file,scripting,wmic,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 似乎是取实际序列号,
for /f "skip=2 tokens=2 delims=," %%a in ('wmic diskdrive get serialnumber /FORMAT:CSV') do (set harddisk=%%a)
这将wmic视为硬盘驱动器序列号的内容分配给一个变量,问题是它返回的序列号稍有偏差。在一个示例中,它返回:
3ZVT01H4
但标签上的序列号是:
Z3TV104H
似乎是取实际序列号,每两个字符反转一次;我是否键入了错误的内容,或者这是一个已知但未记录的问题
是否有一种方法可以将变量拆分为两个字符块,颠倒所有字符的顺序,然后将其放入变量中?您只需要一些循环和基本的子字符串操作 我任意假设这个数字不能超过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
-似乎是取实际序列号,每两个字符反转一次;我是否键入了错误的内容,或者这是一个已知但未记录的问题
据我所知,这是一个好消息。我的角色也是成对颠倒的,而且不限于wmic。如果在WSH中从Win32\U DiskDrive中选择SerialNumber(从winmgmts:\\localhost\root\cimv2中选择),则结果相同
-有没有一种方法可以把变量分成两个字符块,颠倒所有字符的顺序,然后把它放到一个变量中
如果已安装PowerShell,则可以使用。下面是调用PowerShell命令的批处理脚本,以演示:
@回音
setlocal
对于“wmic diskdrive获取序列号^findstr[0-9]”中的/f令牌=*%%I
反向回波:%%I
对于'powershell-命令''%I'-替换'..','$2$1'中的/f令牌=*%%x
设置串行=%%x
已更正回显:%serial%
后藤:EOF
我想这算是个好主意
实际上,如果您只想查看序列而不设置变量,可以使用PowerShell one liner:
powershell gwmi win32_diskdrive |%{$\.serialnumber-替换“..”,“$2$1”}
在将Windows 7操作系统升级到Windows 10后,我在使用wmic diskdrive时正确显示WD驱动器的HDD序列号时没有遇到任何问题:获取型号、名称、序列号、大小,因此看起来Microsoft决定更改物理磁盘驱动器序列号的显示方式
一些有用的背景信息:如果有人运行低级ATA命令从磁盘驱动器获取信息,那么型号名称和序列号的每两个字符实际上是按相反顺序存储的!这可能与所谓的“little endian”有关,也可能与ATA决定存储它们的方式有关 有趣。我想说的是,字符的顺序可能无法预测,但wmic diskdrive get serialnumber似乎也会在我的机器上产生相同的字符对反转。贴纸:WMAV2FA79348;;WMI:W-DMWVAF27A3984