2012-08-13 58 views
0

無聊的班級試圖弄清楚這一點。CMD從管道輸入返回特定行

在Windows命令提示符:

ipconfig /all回報所有的回送,隧道等

,如果我跑ipconfig /all | find /n "Internal"將返回[11]以太網適配器內部。我想要做的就是將11個字符串分開,然後將其傳遞給其他的東西,這樣我就可以返回11-19行或其他東西。你可以做一個類似於jQuery和鏈接的單行嗎?

+0

您忘記了代碼示例中的「/ N」選項。 – dbenham 2012-08-13 16:37:10

+0

糾正'/ N'參數返回特定行。有關其餘的任何幫助? – hokeyplyr48 2012-08-13 17:10:39

回答

0

使用FOR/F循環解析出11是很簡單的。但是從命令行來看,使用這個值是很困難的。

這是我能想到的最好的命令行運行的單線程。

set "stop="&for /f "delims=[]" %N in ('ipconfig /all^|find /n "Internal"') do @for /f "tokens=1* delims=:" %A in ('ipconfig /all^|findstr /n "^"') do @if %A geq %N if not defined stop echo(%B&>nul 2>nul set /a 1/(%A-%N-8)||set stop=1 

我能想到的最短的班輪使用不同的策略。

set n=&for /f "delims=" %A in ('ipconfig/all') do @if defined n (set/a"1/n,n-=1">nul 2>&1&&echo %A) else echo %A|find "Internal"&&set n=8 

但是,上述解決方案忽略空白行。

如果你想保留空白行,則以下工作:

set n=&for /f "tokens=1* delims=:" %A in ('ipconfig/all^|findstr/n "^"') do @if defined n (set/a"1/n,n-=1">nul 2>&1&&echo(%B) else echo %B|find "Internal"&&set n=8 

編輯

我縮短和簡化了第二和第三的解決方案位的邏輯。

我會盡力解釋第二個選項:

我第一次明確地取消對一個計數器,然後用FOR讀取IPCONFIG/ALL條命令的輸出。現在開始DO子句中的有趣部分。

首先計數器是未定義的,所以執行ELSE子句。我管道當前行尋找「內部」尋找。如果沒有找到字符串,則不會發生任何事情,我們將進入下一行。但是如果找到了,那麼這行就會被打印出來。然後&&之後的代碼在找到字符串後執行。在那裏,我將計數器設置爲8,因爲我們希望打印下8行。

計數器是爲其餘行定義的,所以我們現在切換到IF語句的第一部分。我使用SET/A來做一些數學運算。首先,我用計數器的當前值除1。如果計數器爲0,則會引發錯誤,並忽略該語句的其餘部分。如果計數器不是0,那麼我接下來將計數器遞減1.我將stdout和stderr重定向到nul,因爲我們不想看到來自SET/A命令的任何消息。如果SET命令成功,那麼我回顯該行。由於我最初在查找字符串時將計數器設置爲8,因此在計數器達到0之前最多會打印8行。

+0

強烈的上帝之母。無論如何,你可以打破第二個? – hokeyplyr48 2012-08-13 20:04:44

+0

@ hokeyplyr48 - 查看我更新的答案 – dbenham 2012-08-13 21:36:57