如何通过管道传递“ for”命令?


11

我如何通过管道传递给for命令。所以代替

    C:\asd>ipconfig | findstr "Address" >a

   C:\asd>for /f "tokens=15" %f in (a) do @echo %f
   192.168.1.3

我希望能够做到这一点。

C:\asd>ipconfig | findstr "Address" | for /f "tokens=15" %f do @echo %f
do was unexpected at this time.

Answers:


22

尽管它似乎没有记录在案,但您可以通过管道将其传递到FOR命令中。我首先从这个示例中学到了这一点

SC query | FOR /F "tokens=2" %%i IN ('FIND /I "SERVICE_NAME"') DO @ECHO %%i

此代码的修改后的版本适用:

C:\>ipconfig | for /f "tokens=14" %f in ('findstr "Address"') do @echo %f
192.168.x.x
192.168.y.y

您还可以在FOR命令中使用“更多”,如此答案中所述,以解析从任意命令管道输入的输入:

C:\>ipconfig | findstr "Address" | for /f "tokens=14" %f in ('more') do @echo %f
192.168.x.x
192.168.y.y

10

查看文档for(运行for /?查看),我认为for /f不会从管道中读取内容。唯一有效的来源是文件集,“字符串”和“命令”。

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

您可以for像这样将命令放入其中:

for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f

192.168.x.x
192.168.y.y

(感谢神经溶解术指出了这一点^|,而不仅仅是|

或者,您可以尝试放入ipconfig | findstr "Address"单独的批处理脚本并调用:

for /f "tokens=14" %f in ('ipaddresses') do @echo %f

(假设您调用了脚本ipaddresses)。

或者您也可以使用它for来完成以下工作findstr

for /f "tokens=2,14" %i in ('ipconfig') do @if %i==Address. @echo %j

192.168.x.x
192.168.y.y

它并不完全相同,因为它不匹配IPv6地址,但是类似的方法还是可行的。

另请注意,我已更改tokens=15tokens=14。我认为该行的最后一个字段是令牌14。


如果您看我的问题,您会发现我知道使用临时文件,这就是我的示例,我只是将文件称为“ a”。尽管您在一开始就说了什么,但您有一点,最接近做管道的意思是,将命令放在“输入”中。而且我想既然既然可以做到,那也许可以解释为什么不能使用管道进行操作。似乎无法使用管道。有趣的是,您还提到了管道一词。我还没有听说过叫做管道的管道。
barlop 2011年

4
出于记录的原因,它“似乎不支持管道”的原因仅仅是因为您没有逃脱它,而是管道for而不是ipconfig。只要做for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f,什么时候^是转义字符。
Matthieu Cartier

感谢神经溶解,将更新我的答案以包括该内容。
Mikel

好吧,我的意思是像以前一样用管道输送到For。但是我坚信不能。但是可以像在Mikel的建议中那样在“中”。但是尝试使用Mikel的生产线时,我确实遇到了Mikel的生产线问题。而您(神经溶解)通过逃避管道修复了该问题。
barlop 2011年

@barlop,是的,我将删除临时文件建议。“管道”是UNIX术语,表示一系列命令,中间有管道。
Mikel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.