通过批处理文件删除 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 /F
的 tokens
和 delims
选项来摆脱这种情况:
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
)
)
我正在处理一个批处理文件,我需要在其中显示电池的估计剩余电量,我已经实现了我的目标,但遗憾的是,由于命令结果中有过多和不需要的空格,我对结果不满意。
这是我的代码:
: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 /F
的 tokens
和 delims
选项来摆脱这种情况:
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
)
)