为什么在处理 WMIC 输出并向变量赋值时会输出错误消息“Missing operand”?

2023-12-05

我正在处理一个批处理文件,该文件应该显示当前估计的剩余费用。但是当我运行命令时,我得到了所需的结果以及错误消息Missing operand. output.

My code:

FOR /F "delims= skip=1" %%i IN ('WMIC PATH Win32_Battery Get EstimatedChargeRemaining') DO (SET /a CHR=%%i)
ECHO "Battery Level: %CHR%"

我怎样才能摆脱不需要的输出Missing operand.?

我已经尝试删除%从最后一部分开始,即DO (SET /a CHR=i),但是当我这样做时,我最终会得到"Battery Level: 0"就好像它跳过了结果的一些数字。


The Windows 管理规范命令行实用程序输出文本UTF-16Little Endian 编码为字节顺序标记(BOM) 这意味着(几乎)每个字符总是有两个字节且不显示FF FE(BOM 作为十六进制字节)位于输出文本的开头。

FOR设计用于使用 ASCII/ANSI/OEM 编码解析文本,这些编码是字符编码每个字符仅使用一个字节。通过在命令提示符窗口中运行命令来输出所使用的代码页chcp确定哪个字符由十进制范围内的字节表示0 to 255或十六进制00 to FF。默认情况下,Windows 命令行环境中使用的代码页取决于为所使用的用户帐户设置的区域/国家/地区。

让我们看一下发布的代码:

FOR /F "delims= skip=1" %%i IN ('WMIC PATH Win32_Battery Get EstimatedChargeRemaining') DO (SET /a CHR=%%i)
ECHO "Battery Level: %CHR%"

的输出wmic例如是代表 Windows 7 和 Windows XP 上的回车+换行:

EstimatedChargeRemaining  ¶
93                        ¶

此输出重定向到文件并查看十六进制,如下所示:

0000h: FF FE 45 00 73 00 74 00 69 00 6D 00 61 00 74 00 ; ÿþE.s.t.i.m.a.t.
0010h: 65 00 64 00 43 00 68 00 61 00 72 00 67 00 65 00 ; e.d.C.h.a.r.g.e.
0020h: 52 00 65 00 6D 00 61 00 69 00 6E 00 69 00 6E 00 ; R.e.m.a.i.n.i.n.
0030h: 67 00 20 00 20 00 0D 00 0A 00 39 00 33 00 20 00 ; g. . .....9.3. .
0040h: 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 ;  . . . . . . . .
0050h: 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 ;  . . . . . . . .
0060h: 20 00 20 00 20 00 20 00 20 00 20 00 20 00 0D 00 ;  . . . . . . ...
0070h: 0A 00                                           ; ..

格式为:十六进制偏移量:十六进制字节;Windows-1252 字符表示

上面的代码导致跳过第一行输出wmic在由以下命令启动的单独命令进程中FOR with cmd.exe /C通过使用环境变量ComSpec在后台不显示窗口并捕获FOR仅包含值名称EstimatedChargeRemaining.

第二行包含感兴趣的值,具有一位、两位或三位数字,根据值的位数有 21 到 23 个空格,首先将其分配给循环变量i和环境变量旁边CHR使用算术表达式忽略尾随空格。

这段代码是根据评论编写的Stephan关于你之前的问题如何在 WMIC 结果中获得没有不需要空格的值?在 Windows XP 上运行完美,但在 Windows 7 上会出现错误消息:

缺少操作数。

在 Windows XP 上,只有一次循环迭代来分配值93带有 22 个尾随空格和回车符到环境变量CHR其中空格和回车符被命令忽略SET因为算术表达式。

但在 Windows 7 上,循环第二次运行,仅将回车符分配给循环变量i。命令忽略垂直空白字符回车符SET对算术表达式求值,导致在第二次循环迭代中执行set /a CHR=因此,对于语法正确的算术表达式来说,等号后面确实缺少一个操作数。

对于这个问题有多种解决方案FOR解析 UTF-16 编码输出。

一个非常简单的退出FOR将感兴趣的值分配给环境变量后循环。

for /F "skip=1" %%I in ('%SystemRoot%\System32\wbem\wmic.exe PATH Win32_Battery GET EstimatedChargeRemaining') do set "CHR=%%I" & goto HaveValue
:HaveValue
echo Battery level: %CHR%%%

So the FOR循环仅迭代一次并仅处理第二行wmic输出带有感兴趣的值和尾随空格。选项delims=定义一个空的分隔符列表是not用于获取已删除的尾随空格FOR处理从输出捕获的第二行wmic所以循环变量I已经保存了兴趣值,没有尾随空格。这使得可以省略SET范围/A仅将值分配给环境变量而不使用算术表达式。

解决 UTF-16 编码行结尾错误解析问题的另一个简单解决方案wmic输出由FOR使用这样的代码:

for /F "tokens=2 delims==" %%I in ('%SystemRoot%\System32\wbem\wmic.exe PATH Win32_Battery GET EstimatedChargeRemaining /VALUE') do set "CHR=%%I"
echo Battery level: %CHR%%%

的输出wmic有选项/VALUE例如是代表回车+换行:

¶
¶
EstimatedChargeRemaining=93¶
¶
¶

此输出重定向到文件并查看十六进制,如下所示:

0000h: FF FE 0D 00 0A 00 0D 00 0A 00 45 00 73 00 74 00 ; ÿþ........E.s.t.
0010h: 69 00 6D 00 61 00 74 00 65 00 64 00 43 00 68 00 ; i.m.a.t.e.d.C.h.
0020h: 61 00 72 00 67 00 65 00 52 00 65 00 6D 00 61 00 ; a.r.g.e.R.e.m.a.
0030h: 69 00 6E 00 69 00 6E 00 67 00 3D 00 39 00 33 00 ; i.n.i.n.g.=.9.3.
0040h: 0D 00 0A 00 0D 00 0A 00 0D 00 0A 00             ; ............

所以开头有两个空行,总是被忽略FOR即使是 UTF-16 编码。然后是包含值名称和其间带有等号的值的行。最后还有两行空行。

The two FOR选项tokens=2 delims==导致在等号上分割第三行,并在等号之后仅分配第二个字符串作为循环变量感兴趣的值I它只是分配在环境变量旁边CHR。命令SET由于末尾的空行解析错误,仅执行一次wmic输出结果仅在一个子字符串中,仅找到回车符FOR所以它不能给循环变量分配任何东西I因为没有第二个子字符串。是因为FOR不执行命令SET第二次。

发布了一个更简单的解决方案npocmaka as 回答你之前的问题通过使用第二个FOR循环处理感兴趣值正确的行。

其他解决方案使用附加文件或附加命令将 UTF-16 编码文本输出为 ASCII 编码文本,其中FOR可以毫无问题地捕获和处理。查看答案解析输出时如何纠正变量覆盖错误行为?对于这样的解决方案。

为了了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • for /?
  • goto /?
  • set /?
  • wmic /?
  • wmic PATH /?
  • wmic PATH Win32_Battery /?
  • wmic PATH Win32_Battery GET /?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在处理 WMIC 输出并向变量赋值时会输出错误消息“Missing operand”? 的相关文章

随机推荐

  • 为了迭代数组,我们应该使用 size_t 还是 ptrdiff_t?

    In this 安德烈 卡尔波夫 Andrey Karpov 的博客文章标题为 About size t and ptrdiff t 他举了一个例子 for ptrdiff t i 0 i lt n i a i 0 不过不知道对不对 好像应
  • 如何在 F# 中将字典“转换”为序列?

    如何将字典 转换 为序列以便可以按键值排序 let results new Dictionary results Add George 10 results Add Peter 5 results Add Jimmy 9 results A
  • Django 垃圾评论

    Django 的评论框架中的反垃圾邮件系统效果如何 你用过吗 它大约可以防止多少百分比的垃圾评论 您还采取其他措施来帮助防止使用 Django 评论框架的网站上出现垃圾评论吗 有一个 Python API 可以Askimet 这就是 Wor
  • 在C中递归创建并遍历二叉树

    我想创建一个二叉树并通过前序遍历来遍历它 并且我使用递归方法 这些代码可以编译但不能正确运行 我发现它可能无法完成CreateBitree 功能可以 但不知道问题出在哪里 include
  • 在 Android 上的 React-Native 中压缩 Base64 编码图像无法识别“数据”协议

    Issue 在 React Native 0 43 应用程序中 我们使用一个组件 该组件使用 SectionList 来渲染按天排序的照片 每个部分可以包含多个图像 照片是使用反应本机图像作物选择器库并上传到后端 或者在没有可用互联网连接的
  • 核心数据 - 无法在路径加载优化模型

    当我在装有 iOS 9 beta 5 的 iPhone 6 中通过 Xcode 6 运行应用程序时 我在控制台中收到了一些打印内容 CoreData 无法在路径 var mobile Containers Bundle Applicatio
  • 从 Android 设备调用 Web 服务

    我已经使用 python Flask 框架在本地编写了一个 Web 服务 该框架运行在localhost 5000 我通过编写从我的计算机浏览器成功运行此 Web 服务http localhost 5000 toi something 现在
  • 卸载注入的 DLL

    我有一个 DLL 我使用它注入到其他进程中SetWindowsHookEx 在 DLL 内部 我通过调用来增加模块的引用计数器GetModuleHandleEx这样我就可以控制模块何时卸载 此时 这两个 API 调用的模块引用计数 应该 为
  • 使用 PHP 使用 .pfx 证书签署 XML 文件

    我有一个 XML 文档 我想使用 PHP 使用 pfx 证书对其进行签名 我怎么能这样做呢 是否存在某些库或开源代码 或者文档的哪一部分可以帮助我 非常感谢您的帮助 请原谅我的英语不好 以下是使用 pfx 文件签署 xml 文件的最小示例
  • 让 EF 使用具有附加属性的 m:n 表 [重复]

    这个问题在这里已经有答案了 我在创建新应用程序时遇到了问题 该应用程序是关于在特定日期入职的新员工的 由于他们需要一些硬件 例如笔记本电脑 键盘等 我们希望对未来几天内即将到来的所有新员工进行概述 于是就有了以下几种Model Entry
  • 如何访问 VanillaJS 文件中的“this”上下文(Vue/Nuxt 实例)?

    我里面有一个函数 jsnuxt 2 项目中的文件 基本上我需要使用 nuxt 模块属性nuxt config像这样this nuxt options 在正常的函数内部 js file 例如 aNormalJsFile js if this
  • 当您没有类的源代码时,是否可以对对象进行 .NET 二进制序列化?

    我在用BinaryFormatter在 C 中对某些对象进行二进制序列化 但是 某些对象包含我通过 DLL 访问的类 并且没有源代码 因此我无法使用Serializable属性 有没有一种直接的方法来序列化它们 我有一个解决方法 其中包括上
  • mac dns 查找行为不当

    买了一台新 Mac 现在我正在尝试安装 更新一些东西 我遇到的第一个问题是 从内部脚本 程序 例如 git 或 ruby gem 发出的 http 请求不起作用 我将在下面举一个我使用的解决方法的示例 因为它比任何解释都更好地说明了问题 任
  • 如何将 HTML 截断为一定数量的字符?

    我有一些内容 一些来自外部来源 一些专门编写 以博客格式显示 我想在一定数量的字符后截断文本 所以目前我正在这样做 问题是 这会丢失所有格式 我只得到一大块文本 但如果我不剥离标签 显然有些标签会打开并弄乱布局 在 X 个字符后截断 同时保
  • iOS 中的 PBEWithMD5AndDES 加密

    我在 iOS 中遇到 PBEWithMD5AndDES 加密问题 我已经用它加密和解密了我的字符串 https gist github com 788840 24bc73ecd0ac3134cbd242892c74a06ac561d37b
  • 对非矩形图像区域使用 skimage

    假设我关心的是图像的一部分 我想要计算 GLCM 因为它不是矩形的 我该怎么办 我已经制作了一个屏蔽程序 将我不关心的图像部分归零 我只是不知道如何在不考虑图像的归零部分的情况下获取这个 屏蔽 图像 感谢您的帮助 如果您能够将零强度值分配给
  • 谁能解释为什么 strtotime('cast') 返回一个值?

    这并不是一个真正的问题 尽管它与我们的 if 语句冲突 但是当您输入 strtotime cast 时 它会返回一个默认为今天日期的实际值 我只是想知道是否有人知道cast这个词对于时间函数有什么意义 Thanks 它映射到 澳大利亚 阿德
  • 在 Pyramid 中的视图之间传递表单参数

    我正在创建一个表单 在提交数据之前需要用户确认 我想要一个单独的确认页面 因为我需要显示有关如何处理表单数据的大量信息 我想知道是否有一种Pythonic 方法可以在金字塔中的表单之间传递数据 提交表单会将用户带到确认页面 因此 确认视图的
  • 如何在Asp.net mvc中获取请求处理时间?

    我想记录请求处理时间Asp Net MVC 应用 我可以得到 所用的时间 来自 IIS 日志 但这次包括将响应发送回客户端浏览器所花费的网络时间 我只对 ASP NET 工作进程处理请求所花费的时间感兴趣 我可以选择写一个Http模块但我无
  • 为什么在处理 WMIC 输出并向变量赋值时会输出错误消息“Missing operand”?

    我正在处理一个批处理文件 该文件应该显示当前估计的剩余费用 但是当我运行命令时 我得到了所需的结果以及错误消息Missing operand output My code FOR F delims skip 1 i IN WMIC PATH