Для /F с wmic нежелательным выводом

Первый пост здесь, так что извините, если я не сделаю это совершенно правильно.

Я пытаюсь вывести версию ОС на удаленный компьютер с Windows, но продолжаю получать нежелательные данные. Выполнение этого командного файла:

@echo off
set /p hostname=PC hostname?
echo.
FOR /F "skip=1 tokens=*" %%A in ('wmic /node:%hostname% OS get caption') DO echo %%A
echo.
pause

Возвращает этот результат:

Microsoft Windows 7 Professional
Echo is off.

Я был в состоянии удалить Caption вывод с использованием skip=1 но я не понимаю, где echo Команда исходит от. Разделение команд не помогло, но включение эха показывает, что, по-видимому, выводится зацикленная команда wmic echo после вывода версии ОС, поэтому, очевидно, когда эхо отключено, я получаю окончательный вывод: Echo is off, Может ли кто-нибудь помочь мне понять, почему echo выход происходит?

3 ответа

Решение

Магу определил источник проблемы - преобразование вывода Unicode WMIC в ANSI имеет недостатки, так как каждая строка заканчивается CRCRLF вместо обычного CRLF.

FOR /F разбивает (и удаляет) каждый LF, оставляя CRCR. FOR /F удаляет последний символ из каждой строки в том и только в том случае, если это CR, поэтому остается один CR в конце каждой строки. FOR /F игнорирует пустые строки, но CR не пустая строка, следовательно, нежелательная Echo is off. выход.

Magoo и Squashman предоставили работоспособные решения вашей проблемы, но они не являются общими решениями, применимыми ко всем ситуациям FOR /F - WMIC. Распространенная проблема возникает, когда выходные данные FOR /F хранятся в переменных - нежелательный CR часто находится в конце значения, что может вызвать проблемы в дальнейшем.

Мы можем использовать известную механику FOR /F, чтобы убрать нежелательный CR из каждой строки, просто добавив дополнительный FOR /F.

Так что шаблон, который всегда работает, выглядит так

for delims^=^ eol^= %%. in ('wmic ....') do for /f "whatever options you need" %%A in ("%%.") do ...

или если вам нужно пропустить N строк, то

for skip^=N^ delims^=^ eol^= %%. in ('wmic ....') do for /f "whatever options you need" %%A in ("%%.") do ...

Тайный синтаксис в первом FOR /F устанавливает значения DELIMS и EOL равными нулю. Если вы знаете, что ни один из ваших выводов не начинается с ;, то вы можете просто использовать "delims=", или же "skip=N delims=", Это тот случай, в вашей ситуации.

Таким образом, решение становится:

for /f "skip=1 delims=" %%. in ('wmic /node:%hostname% OS get caption') do for /f "delims=" %%A in ("%%.") do echo %%A

Передайте это команде поиска.

@echo off
set /p hostname=PC hostname?
echo.
FOR /F "tokens=1,2 delims==" %%A in ('wmic /node:%hostname% OS get caption /value ^|find /I "caption"') DO echo %%B
echo.
pause

Я бы предложил

set "remotever="
FOR /F "skip=1 tokens=*" %%A in ('wmic /node:%hostname% OS get caption^|more') DO if not defined remotever set "remotever=%%A"
echo %remotever:~0,-1%

more классический метод конвертации wmicВывод Unicode в ANSI.

Но есть подвох. Помимо Unicode, WMIC "заканчивает" свои строки CRCRLF, а не CRLF, и предпоследний CR затем включается в значение, назначенное переменной (следовательно, echo подстрока не включает в себя последний символ - и вы найдете несколько пробелов...).

(как немного проще, попробуйте echo q%%Aj в оригинале - вы найдете q перезаписывается j)

Следовательно, чтобы захватить первую строку, set переменная к нулю, то в for петля set это значение, которое вы хотите захватить, но ворота set с if not defined,

@echo off
for /f "usebackq delims= skip=1" %%a in (`wmic OS get caption 2^>nul ^| findstr "."`) do set caption=%%a
for /f "usebackq delims=" %%a in (`echo %caption%`) do set caption=%%a
set "caption=%caption:~0,-1%"
echo Caption=[%caption%]
Другие вопросы по тегам