【问题标题】:Invalid Verb on WMIC get variableWMIC 上的无效动词获取变量
【发布时间】:2019-05-29 15:36:09
【问题描述】:

我正在尝试将主硬盘序列号获取到一个变量,以便稍后成为echoed。

我用过这个,效果很好:

for /f "tokens=2 delims== " %%k in ('WMIC path win32_physicalmedia get serialnumber /value') do (for /f "delims=" %%l in ("%%k") do set "SerialNumber=%%l")

但是,它只做最后一个序列号,我想得到主要的。

如果我使用这个命令,

"wmic path win32_physicalmedia where tag='\\\\.\\PHYSICALDRIVE0' get serialnumber /value" 

然后我只得到想要的序列号。

问题是当我尝试修改工作代码时,运行 bat 时出现错误:

动词无效。

努力上班:

for /f "tokens=2 delims== " %%k in ('wmic path win32_physicalmedia where tag='\\\\.\\PHYSICALDRIVE0' get serialnumber /value') do (for /f "delims=" %%l in ("%%k") do set SerialNumber=%%l)

错误:

无效动词

如果我只跑:

wmic path win32_physicalmedia where tag='\\\\.\\PHYSICALDRIVE0' get serialnumber /value in CMD

我得到以下输出:

SerialNumber=     WD-WCC2E1XJADRT

所以我知道该命令有效。

空格是否在中都没关系,我只想要=之后的内容。我在支持 WMIC 的 WINPE 中执行此操作,因此不能选择 Powershell。

总脚本

@echo OFF
setlocal
for %%v in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%v:\drives.txt set w=%%v

for /f "tokens=2 delims== " %%k in ('wmic path win32_physicalmedia where tag='\\\\.\\PHYSICALDRIVE0' get serialnumber /value)') do (for /f "delims=" %%l in ("%%k") do set SerialNumber=%%l)

for /F "tokens=2" %%i in ('date /t') do set "Date=%%i"
echo %SerialNumber%,%Date% >> %w%:\drives.txt

【问题讨论】:

  • 我想像 ^= 这样转义等号应该可以工作......

标签: batch-file scripting delimiter wmic


【解决方案1】:

如果您将命令修改为:

WMIC Path Win32_PhysicalMedia Where "Tag='\\\\.\\PHYSICALDRIVE0'" Get SerialNumber /Value

= 将受到保护。

试试这样:

@Echo Off
For /F "Tokens=1*Delims==" %%A in ('
    WMIC Path Win32_PhysicalMedia Where "Tag='\\\\.\\PHYSICALDRIVE0'" Get SerialNumber /Value 2^>Nul
') Do For %%C In (%%B) Do Set "SerialNumber=%%C"
Echo [%SerialNumber%] & Pause

我添加最后一行只是为了显示任何返回的变量和值。

【讨论】:

  • 我什至从未认为 Tag = 是罪魁祸首。非常感谢!
  • 引用标签修复了它,但是我想指出脚本输出中的 Tokens=1 只是“SerialNumber”,因为它在第一个分隔符之前。对于可能使用它的任何其他人,我仍然需要 Tokens=2 来获取实际的序列号。
  • @IndigoAtaxia:不,你没有。 tokens=1* 表示有两个令牌。 Token1 (%%A) 是您所期望的,* 是 token2 (%%B) 是“所有其余部分”(不再分隔)。当分隔符可能也是字符串的一部分时很有用。
  • TBF,我也会为您的误解承担一些责任@IndigoAtaxia,我喜欢出于个人喜好不必要地更改内容,更正确的语法是"Tokens=1,* Delims=="。如果我这样做了,您会更清楚地将星号视为另一个标记。
【解决方案2】:

在 powershell 中会很容易。您可以在 winpe 的文件共享上提取 Powershell 6 (pwsh) 的 zip。 https://github.com/PowerShell/PowerShell/releases/download/v6.2.1/PowerShell-6.2.1-win-x64.zip

$SerialNumber = Get-CimInstance win32_physicalmedia | 
  Where tag -Match physicaldrive0 | Select -Expand serialnumber

这是另一种 .bat 方式('%' 是 sql 通配符,您必须在 .bat 文件中将它们加倍):

for /f "skip=1" %%i in ('wmic path win32_physicalmedia where "tag like '%%PHYSICALDRIVE0%%'" get serialnumber') do if not defined serialnumber set serialnumber=%%i

【讨论】:

  • 是的,我同意,但是我在没有 Powershell 支持的情况下在 WINPE 中执行此操作。添加 PS 支持会使 WIM 太大。
  • 如果您愿意,您可以在共享中运行 PS 6。它是便携式的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 2021-01-24
  • 2023-03-22
相关资源
最近更新 更多