Для /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%]