Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file WMIC返回奇数序列号_Batch File_Scripting_Wmic - Fatal编程技术网

Batch file 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 似乎是取实际序列号,

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

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