Я не понимаю, почему вы задаете в основном один и тот же вопрос дважды ...
В любом случае, если коротко, то короткая история: wmic
возвращает текст Unicode, а for /F
сделано для текста ASCII / ANSI.for /F
преобразует текст Unicode в ANSI, но оставляет за собой артефакты преобразования, такие как осиротевшие символы возврата каретки.Это причина, почему, кажется, выводятся пустые строки после (последней) строки данных.Конечные ПРОБЕЛЫ не являются артефактами преобразования, они действительно выводятся командой wmic
.
Например, командная строка:
for /F "delims=" %%I in ('wmic Path Win32_Battery get EstimatedChargeRemaining') do echo/%%I
...outputs что-то вроде следующего текста ({CR}
обозначает символ возврата каретки и {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
в своем коде).Любые конечные пробелы все еще там, хотя.Однако от этого можно избавиться, адекватно адаптировав опции tokens
и delims
для for /F
:
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
Еще лучший способ, особенно когда данные, возвращаемые wmic
, могут содержать ПРОБЕЛЫ на ихown - изменить выходной формат команды 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
удаляет эти возврат кареткисимволов, поэтому командная строка:
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
)
Результат будет примерно таким:
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
)
)