CMD从管道输入返回特定行

时间:2012-08-13 15:12:03

标签: cmd

在课堂上无聊,试图解决这个问题。

在Windows命令提示符下:

ipconfig /all返回所有环回,隧道等。

如果我运行ipconfig /all | find /n "Internal",它将返回[11] Ethernet Adapter Internal。我想要做的是将11从开始子串起来然后将其传递给其他东西,这将允许我返回第11-19行或其他任何东西。你能用一行类似于jquery和chaining吗?

1 个答案:

答案 0 :(得分: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子句。我将当前行传递给FIND寻找“内部”。如果找不到字符串,则没有任何反应,我们将进入下一行。但如果找到则打印出该行。然后在找到字符串后执行&&之后的代码。在那里我将计数器设置为8,因为我们希望打印下面的8行。

计数器是为其余的行定义的,所以我们现在切换到IF语句的第一部分。我用SET / A做一些数学运算。首先,我将1除以计数器的当前值。如果计数器为0,则会引发错误,并忽略该语句的其余部分。如果计数器不为0,那么我接下来将计数器递减1.我将stdout和stderr重定向到nul,因为我们不希望看到来自SET / A命令的任何消息。如果SET命令成功,那么我回显该行。由于我在找到字符串时最初将计数器设置为8,因此在计数器达到0之前最多会打印8行。