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

Remove unwanted spaces in wmic results through batch file

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

这是我的代码:

: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 "

如何去掉结果末尾的那些空格?

在此先致谢,非常感谢任何形式的帮助。

这样试试:

: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

我不明白你为什么基本上问 两次...

无论如何,长话短说:wmic returns Unicode 文本,而 for /F 是为 ASCII/ANSI 文本制作的。 for /F 将 Unicode 文本转换为 ANSI,但会留下转换伪像,如孤立的回车 -return 字符。这就是为什么在(最后)数据行之后似乎有输出空行的原因。尾随的 SPACEs 不是转换产物,它们实际上是由 wmic 命令输出的。

例如命令行:

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

...输出类似于以下文本的内容({CR} 代表回车-return 字符,{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 循环删除那些回车符-return,所以命令行:

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}

如您所见,carriage-return 字符消失了,最后一行也消失了(您可以通过代码中的 goto return 命令跳过)。任何尾随 SPACEs 仍然存在。但是,可以通过适当调整 for /Ftokensdelims 选项来摆脱这种情况:

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
)

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

100

一个更好的方法,特别是当 wmic 编辑的数据 return 可能包含 SPACEs 时,是使用 /VALUE 选项更改 wmic 命令的输出格式,该选项不会产生尾随空格。

例如命令行:

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

...输出类似于以下文本的内容({CR} 代表回车-return 字符):

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

再次围绕另一个 for /F 循环删除那些回车-return 字符,因此命令行:

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

...会输出如下内容:

EstimatedChargeRemaining=100

此外,carriage-return 字符消失了,所有只包含一个这样的字符的行也消失了。请注意,根本没有尾随 SPACEs。现在你只需要拆分值的名称:

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
)

输出将类似于:

100

如果值以等号开头,则此方法失败。要正确处理此类问题,您可以这样做:

for /F "delims=" %%I in ('wmic Path Win32_Battery get EstimatedChargeRemaining /VALUE') do (
    for /F "delims=" %%J in ("%%I") do (
        rem // Store whole line in a variable:
        set "VALUE=%%K"
        rem // Toggle delayed expansion to not lose exclamation marks:
        setlocal EnableDelayedExpansion
        rem // Split off value name:
        set "VALUE=!VALUE:*EstimatedChargeRemaining=!"
        rem // Split off leading `=`:
        echo(!VALUE:~1!
        endlocal
    )
)