簡體   English   中英

對於帶Wmic的/ F有害輸出

[英]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以外, WMICCR CR LF(不是CR LF) “結束”其行,然后將倒數第二個CR 包含在分配給變量的值中(因此, echo顯子字符串不包括最后一個字符-您會發現一些尾隨空格...)。

(作為一個稍微簡單的演示,請嘗試在原始echo q%%Ajecho q%%Aj您會發現qj覆蓋了)

因此,要捕獲第一行, set變量setnothing ,然后在for循環setset為要捕獲的值,但if not definedif not definedset為門。

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM