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
好像它是采用实际的序列号并反转每两个字符; 我输错了什么或这是一个已知的(但没有记录在案的地方)问题?
有没有办法让我可以获取变量,将其拆分为两个字符块,颠倒所有这些字符的顺序,然后将其放入变量?
-- 好像是取了实际的序列号,每两个字符颠倒一次;我打错了什么还是这是一个已知的(但没有记录在任何地方)问题?
尽我所能,这显然是一个错误。我的字符也是成对反转的,而且不仅限于 wmic。如果我SELECT SerialNumber FROM Win32_DiskDrive
来自winmgmts:\\localhost\root\cimv2
WSH,结果相同。
-- 有没有办法可以将变量拆分为两个字符块,颠倒所有这些字符的顺序,然后将其放入一个变量中?
如果您安装了 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)