как мне передать команду «за»?

11

Как мне передать по команде? Так что вместо

    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.
barlop
источник

Ответы:

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

Вы также можете использовать «more» внутри команды 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=15на tokens=14. Я думаю, что последнее поле в строке - это токен 14. У меня все равно работает.

Mikel
источник
Если вы посмотрите на мой вопрос, вы увидите, что я знаю об использовании временного файла, это был мой пример, я просто назвал файл «а». С тем, что вы говорите в начале, у вас есть точка, самая близкая к выполнению конвейера ... это ввод команды в "in". И я полагаю, что поскольку это можно сделать, это может объяснить, почему нельзя использовать канал для. Похоже, никто не может использовать трубу к нему. Интересно также, что вы упомянули термин конвейер. Я не слышал, чтобы канал называл это ... но Google показывает это.
Бароп
4
Для справки, причина, по которой он «не поддерживает конвейеры», заключается просто в том, что вы не избежали его, forвместо того, чтобы использовать его ipconfig. Просто сделайте for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f, когда ^это побег персонаж.
Матье Картье
Спасибо neurolysis, обновит мой ответ, чтобы включить это.
Микель
Ну, я имел в виду пайпинг для For, как и раньше. Но я уверен, что никто не может. Но может в "в", как в предложении Микеля. Но, попробовав линию Микеля, я столкнулся с проблемой линии Микеля ... и вы (нейролиз) исправили это, сбежав из трубы.
Бароп
@ barlop, да, я удалю предложение временного файла. «pipe» - это термин UNIX, означающий серию команд с каналами в середине.
Микель