我希望运行一个命令,并在一个批处理文件中总结输出。以下是代码:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET NoOfCores=0
FOR /F "skip=1 USEBACKQ" %%G IN (`wmic cpu get NumberOfLogicalProcessors`) DO (
IF NOT "%%G" == "" (
SET /A NoOfCores = !NoOfCores! + %%G
)
)
echo NoOfCores:%NoOfCores%
ENDLOCAL当我运行这个批处理文件时,我得到了正确的输出以及一个错误:
Missing operand.
NoOfCores:8当我手动运行命令wmic cpu get NumberOfLogicalProcessors时,得到的输出如下:
NumberOfLogicalProcessors
4
4有人能告诉我如何跳过输出中的最后一行吗?
我已经提到了几篇关于在IF条件下检查空/空值的文章,但似乎没有一篇有效。
发布于 2016-06-22 06:09:55
wmic的输出用UTF-16小端编码,通过命令对的解析造成麻烦。
命令FOR在将Unicode转换为单字节编码文本时将文件的结尾解释为回车、回车、返回行提要。错误的回车返回使最后一行不为空。在提供的批处理代码中,这将导致IF NOT "%%G" == ""为true,因为循环变量包含回车。但是命令将设置为计算算术表达式,将回车解释为空白字符,因此实际上缺少了附加的第二个操作数。
但是,在命令提示符窗口中运行批处理文件时看不到所有这些,第一行是@echo on,在写控制台窗口时,每次回车都由流编写器删除。
有关更多细节,请参见关于如何在解析输出时纠正变量覆盖错误行为的答案。
一种解决方法是首先将wmic的输出重定向到一个临时文件中,并在FOR中使用命令类型来处理这些行,因为命令类型使从Unicode转换为OEM的工作比对的命令更好。处理行后删除临时文件。
@echo off
setlocal EnableDelayedExpansion
%SystemRoot%\System32\wbem\wmic.exe cpu get NumberOfLogicalProcessors >"%TEMP%\NumberOfLogicalProcessors.tmp"
set "NoOfCores=0"
for /F "skip=1" %%G in ('type "%TEMP%\NumberOfLogicalProcessors.tmp"') do set /A NoOfCores+=%%G
del "%TEMP%\NumberOfLogicalProcessors.tmp"
echo NoOfCores: %NoOfCores%
endlocal要了解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并非常仔细地读取为每个命令显示的所有帮助页。
del /?echo /?endlocal /?for /?set /?setlocal /?type /?wmic cpu get /?发布于 2016-06-22 11:56:17
莫菲的回答很好地解释了这里正在发生的事情,并提供了一个解决方案。
不过,还有一种更简单的方法:第二次放置另一个for /F循环来解析第一个循环的输出,以消除孤立的回车字符。这是正确解析Unicode文本的最简单、最通用的解决方案。
下面是我要使用的代码:
@echo off
set /A NoOfCores=0
for /F "skip=1" %%G in ('wmic cpu get NumberOfLogicalProcessors') do (
for /F %%H in ("%%G") do (
set /A NoOfCores+=%%G
)
)
echo NoOfCores: %NoOfCores%这个方法被归功于德本纳姆 --见他对为什么这个批处理脚本中的FOR /f循环计算空行?的回答以及他的外部文章问题。
https://stackoverflow.com/questions/37959586
复制相似问题