通过批处理文件删除WMIC结果中不需要的空格

时间:2018-11-29 14:54:17

标签: batch-file cmd wmic

我正在处理一个批处理文件,其中需要显示电池的估计剩余电量,我已经实现了我的目标,但是由于命令结果中存在多余和多余的空格,我对结果不满意。

这是我的代码:

:charge
FOR /F "delims= skip=1" %%i IN ('WMIC PATH Win32_Battery Get EstimatedChargeRemaining') DO ( SET CHR=%%i
GOTO results )

:results
ECHO "Battery Percentage: %CHR%"
PAUSE
GOTO menu

以上命令的结果为:"Battery Percentage: 100 "

如何在结果末尾去除那些空格?

预先感谢,非常感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:4)

尝试这样:

:charge
@echo off
FOR /F "tokens=* delims=" %%i IN ('WMIC PATH Win32_Battery Get EstimatedChargeRemaining /format:value') DO (
    for /f "tokens=* delims=" %%# in ("%%i") do set "%%#"
)
echo %EstimatedChargeRemaining%

WMIC添加了其他字符,但可以使用for循环再删除一个-> https://www.dostips.com/forum/viewtopic.php?t=4266

答案 1 :(得分:2)

我不明白您为什么要问same question两次...

无论如何,总而言之:wmic返回Unicode文本,而for /F用于ASCII / ANSI文本。 for /F将Unicode文本转换为ANSI,但留下了诸如孤立的回车符之类的转换伪影。这就是为什么似乎在(最后)数据行之后输出空行的原因。尾随的 SPACE 不是转换伪像,它们实际上是由wmic命令输出的。

例如,命令行:

for /F "delims=" %%I in ('wmic Path Win32_Battery get EstimatedChargeRemaining') do echo/%%I

...输出类似以下文本的内容({CR}代表回车符,{SPACE}代表 SPACE ):

EstimatedChargeRemaining{SPACE}{SPACE}{CR}
100{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{CR}
{CR}

环绕另一个for /F循环会删除这些回车符,因此,命令行:

for /F "delims=" %%I in ('wmic Path Win32_Battery get EstimatedChargeRemaining') do (
    for /F "delims=" %%J in ("%%I") do echo/%%J
)

...将输出如下内容:

EstimatedChargeRemaining{SPACE}{SPACE}
100{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}{SPACE}

如您所见,回车符消失了,最后一行也消失了(您在代码中通过goto return命令跳过了该行)。不过,任何尾随的 SPACE 仍然存在。但是,可以通过适当调整tokens的{​​{1}}和delims选项来消除这种情况:

for /F

输出将类似于(这次没有任何尾随的 SPACE ):

rem // Skip the header line by `skip` option in the outer loop; do not tokenise anything here:
for /F "skip=1 delims=" %%I in ('wmic Path Win32_Battery get EstimatedChargeRemaining') do (
    rem /* Tokenise the output as needed in the inner loop;
    rem    remember that `tokens` defaults to `1` and `delims` defaults to SPACE and TAB: */
    for /F %%J in ("%%I") do echo/%%J
)

一种更好的方法,尤其是当100 返回的数据可能单独包含 SPACE 时,是使用{更改wmic命令的输出格式{1}}选项,不会产生尾随空格。

例如,命令行:

wmic

...输出类似以下文本的内容(/VALUE代表回车符):

for /F "delims=" %%I in ('wmic Path Win32_Battery get EstimatedChargeRemaining /VALUE') do echo/%%I

再次环绕另一个{CR}循环将删除那些回车符,因此,命令行:

{CR}
{CR}
EstimatedChargeRemaining=100{CR}
{CR}
{CR}
{CR}

...将输出如下内容:

for /F

这里,回车符也消失了,所有仅包含一个这样的字符的行也消失了。请注意,根本没有结尾的 SPACE 。现在,您只需要拆分值的名称:

for /F "delims=" %%I in ('wmic Path Win32_Battery get EstimatedChargeRemaining /VALUE') do (
    for /F "delims=" %%J in ("%%I") do echo/%%J
)

输出将类似于:

EstimatedChargeRemaining=100

如果值以等号开头,则此方法失败。要正确处理此类问题,您可以执行以下操作:

rem // Do not tokenise anything in the outer loop:
for /F "delims=" %%I in ('wmic Path Win32_Battery get EstimatedChargeRemaining /VALUE') do (
    rem /* Tokenise the output as needed in the inner loop: */
    for /F "tokens=1* delims==" %%J in ("%%I") do echo/%%K
)