як я перейду до команди «за»?


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.

Відповіді:


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=15на tokens=14. Я думаю, що останнє поле у ​​рядку - це маркер 14. Діє для мене все одно.


Якщо ви подивитесь на моє запитання, ви побачите, що я знаю про використання тимчасового файлу, це був мій приклад, я щойно назвав файл "a". З тим, що ви говорите на початку, у вас є точка, найближча до виконання труби .. - це введення команди в "в". І я вважаю, що оскільки це можна зробити, це може пояснити, чому не можна використовувати трубу для. Схоже, ніхто не може використовувати трубу до неї. Цікаво також, що ви згадуєте термін "трубопровід". Я не чув, щоб труба називалася .. але Google показує це.
барлоп

4
Для запису, причина, по якій "схоже, не підтримує трубопроводи", полягає лише в тому, що ви цього не зробили, forа замість цього ipconfig. Тільки зроби for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f, коли ^персонаж втечі.
Матьє Картьє

Дякуючи невролізу, оновлю мою відповідь, щоб включити це.
Мікель

Ну я мав на увазі підключення до For, як і раніше. Але я переконаний, що цього не можна. Але може в "в", як у пропозиції Мікеля. Але спробувавши лінію Мікеля, я зіткнувся з проблемою з лінією Мікеля .. і ви (невроліз) виправили це, рятуючись від труби.
барлоп

@barlop, так, я вилучу пропозицію щодо темпфілів. "трубопровід" - це термін UNIX, що означає серію команд з трубами посередині.
Мікель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.