[英]For /F with wmic unwanted output
首先在這里發帖,如果我做的不對,就此深表歉意。
我正在嘗試在遠程Windows PC上輸出OS版本,但是我一直在獲取不需要的數據。 執行此批處理文件:
@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.
我可以使用skip=1
刪除Caption
輸出,但是我不知道echo
命令的來源。 拆分命令沒有幫助,但是打開echo顯然表明,循環的wmic命令在輸出OS版本后正在輸出echo
,因此,顯然,當echo關閉時,我得到了最終輸出: Echo is off
。 誰能幫助我了解為什么發生echo
?
Magoo確定了問題的根源-WMIC Unicode輸出到ANSI的轉換存在缺陷,因為每行以CR CR LF而不是普通CR LF結尾。
FOR / F在每個LF處中斷(並剝離),留下CR CR 。 當且僅當它恰好是CR時 ,FOR / F才從每行中刪除最后一個字符,因此在每行的末尾留下一個CR 。 FOR / F忽略空行,但是CR不是空行,因此不需要的Echo is off.
輸出。
Magoo和Squashman為您的問題提供了可行的解決方案,但它們不是適用於所有FOR / F-WMIC情況的通用解決方案。 將FOR / F輸出存儲在變量中時,會出現一個常見問題-不必要的CR通常位於值的末尾,這可能會在以后引起問題。
通過簡單地添加一個額外的FOR / F,我們可以使用FOR / F的已知機制從每行剝離不需要的CR 。
因此,始終有效的通用模板看起來像
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
將其通過管道傳遞給find命令。
@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
是經典分批方法CONVER wmic
的unicode的輸出為ANSI。
但是有一個陷阱。 除了Unicode以外, WMIC
以CR CR LF(不是CR LF) “結束”其行,然后將倒數第二個CR 包含在分配給變量的值中(因此, echo
顯子字符串不包括最后一個字符-您會發現一些尾隨空格...)。
(作為一個稍微簡單的演示,請嘗試在原始echo q%%Aj
中echo q%%Aj
您會發現q
被j
覆蓋了)
因此,要捕獲第一行, set
變量set
為nothing ,然后在for
循環set
其set
為要捕獲的值,但if not defined
, if not defined
其set
為門。
@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%]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.