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

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

我如何通过管道传输到 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.

答案1

虽然似乎没有文档说明,但您可以通过管道将命令传递到 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 命令中使用“more”,如下所述这个答案,解析来自任意命令的管道输入:

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

答案2

查看文档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。无论如何对我来说都有效。

相关内容