2014-02-14 84 views
0

以下命令在Windows Vista及更早版本上無法正確運行。它在Windows 7及更高版本上運行良好。如果在帶有FOR變量的BATCH/CMD FOR循環中無效(例如,%p)

BATCH示例(名爲whateveryouwanttocallit.cmdsomescript.bat(擴展沒有在這種情況下重要)):

for /f "tokens=*" %%p in ('ping -n 1 127.0.0.1') do if not "%%p"=="" echo %%p 

上面的腳本試圖只顯示非空行。

在Windows 7的機器,會生成以下(正確)輸出:

Pinging 127.0.0.1 with 32 bytes of data: 
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 
Ping statistics for 127.0.0.1: 
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
Minimum = 0ms, Maximum = 0ms, Average = 0ms 

在Windows Vista和更早版本相同的腳本將產生不正確的輸出:

ECHO is on. 
Pinging 127.0.0.1 with 32 bytes of data: 

ECHO is on. 
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 

ECHO is on. 
Ping statistics for 127.0.0.1: 

Packets: Sent = 1, Received = 1, Lost = 0 (0% loss), 

Approximate round trip times in milli-seconds: 

Minimum = 0ms, Maximum = 0ms, Average = 0ms 

它看起來像前面系統有額外的換行。 早期系統有不同的輸出格式嗎?有沒有辦法以一種適用於早期和後期系統的方式完成此任務?解決方案越簡單越好。

+2

在批處理文件訪問令牌,當你需要雙''%...->使用'%% p' – npocmaka

+1

你也應該使用'」 delims =「'解析整行。 – foxidrive

+0

@npocmaka我的錯誤,我應該澄清一點。該問題仍然存在於cmd和批處理腳本中 – Lectrode

回答

2

測試在XP

所有的輸出端線,而不是與0X0D的0x0A(CR-LF)如常,但與0X0D 0X0D的0x0A

有在端部的aditional的回車每一行。這不會影響數據行中的代碼,但會在「空行」中產生錯誤。

for命令處理輸入時,如果沒有變量/可替換參數獲取數據,該行將被忽略,並且do部分中的代碼不會被執行。但在這種情況下,沒有明顯內容的行具有內容,即0x0D字符,並且被標記爲%p。因此,行不會被忽略,do部分將被執行,if將在條件中返回false,因爲該變量包含內容,並且echo命令會嘗試輸出回車符。但事實上,echo命令解釋該行沒有內容,並且echo on/off被輸出到控制檯。

爲了只是避免echo on/off輸出到控制檯,使用echo(%p

爲了避免處理「空」的線條,過濾ping命令輸出

for /f "tokens=*" %p in ('ping -n 1 127.0.0.1 ^| findstr /r "[a-z]"') do .... 
+0

非常好的解決方案!這正是我所需要的 – Lectrode

+0

我知道,現在我知道爲什麼。 +1非常好的解釋 – Stephan

+0

只要行('%p')沒有與任何其他文本組合,就會工作。但它包含尾隨的0x0D,如果需要附加其他字符,可能會導致問題。請參閱[我的答案](http://stackoverflow.com/a/21782435/1012053),瞭解一個簡單的解決方案,即刪除尾隨的0x0D。 – dbenham

1

FOR/F將剝離恰好一個尾隨0X0D字符從每條線(如果存在)。因此,另一種選擇是添加一個額外的FOR/F循環:

for /f "delims=" %%A in ('ping -n 1 127.0.0.1') do for /f "delims=" %%B in ("%%A") do echo %%B 
+0

+1好的替代解決方案 – Lectrode