首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过跳过Windows批处理文件for循环中的空白/空值来总结命令输出

通过跳过Windows批处理文件for循环中的空白/空值来总结命令输出
EN

Stack Overflow用户
提问于 2016-06-22 05:51:59
回答 2查看 595关注 0票数 1

我希望运行一个命令,并在一个批处理文件中总结输出。以下是代码:

代码语言:javascript
运行
复制
@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

当我运行这个批处理文件时,我得到了正确的输出以及一个错误:

代码语言:javascript
运行
复制
Missing operand.
NoOfCores:8

当我手动运行命令wmic cpu get NumberOfLogicalProcessors时,得到的输出如下:

代码语言:javascript
运行
复制
NumberOfLogicalProcessors
4
4

有人能告诉我如何跳过输出中的最后一行吗?

我已经提到了几篇关于在IF条件下检查空/空值的文章,但似乎没有一篇有效。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-22 06:09:55

wmic的输出用UTF-16小端编码,通过命令的解析造成麻烦。

命令FOR在将Unicode转换为单字节编码文本时将文件的结尾解释为回车、回车、返回行提要。错误的回车返回使最后一行不为空。在提供的批处理代码中,这将导致IF NOT "%%G" == ""为true,因为循环变量包含回车。但是命令设置为计算算术表达式,将回车解释为空白字符,因此实际上缺少了附加的第二个操作数。

但是,在命令提示符窗口中运行批处理文件时看不到所有这些,第一行是@echo on,在写控制台窗口时,每次回车都由流编写器删除。

有关更多细节,请参见关于如何在解析输出时纠正变量覆盖错误行为的答案。

一种解决方法是首先将wmic的输出重定向到一个临时文件中,并在FOR中使用命令类型来处理这些行,因为命令类型使从Unicode转换为OEM的工作比对的命令更好。处理行后删除临时文件。

代码语言:javascript
运行
复制
@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 /?
票数 2
EN

Stack Overflow用户

发布于 2016-06-22 11:56:17

莫菲的回答很好地解释了这里正在发生的事情,并提供了一个解决方案。

不过,还有一种更简单的方法:第二次放置另一个for /F循环来解析第一个循环的输出,以消除孤立的回车字符。这是正确解析Unicode文本的最简单、最通用的解决方案。

下面是我要使用的代码:

代码语言:javascript
运行
复制
@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循环计算空行?的回答以及他的外部文章问题

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37959586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档