Удалите ненужные пробелы в результатах wmic через командный файл - PullRequest
0 голосов
/ 29 ноября 2018

Я работаю над пакетным файлом, в котором мне нужно показать примерный оставшийся заряд батареи, я достиг своей цели, но, к сожалению, я не доволен результатами из-за чрезмерных и нежелательных пробелов в результате команды.

Вот мой код:

: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 голосов
/ 30 ноября 2018

Я не понимаю, почему вы задаете в основном один и тот же вопрос дважды ...

В любом случае, если коротко, то короткая история: 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
    )
)
0 голосов
/ 29 ноября 2018

попробуйте так:

: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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...