jak mogę potokować do polecenia „for”?

11

Jak wykonać potok do polecenia for. Więc zamiast

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

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

Chciałbym móc to zrobić w jednej linii.

C:\asd>ipconfig | findstr "Address" | for /f "tokens=15" %f do @echo %f
do was unexpected at this time.
barlop
źródło

Odpowiedzi:

22

Chociaż wydaje się, że nie jest to udokumentowane, możesz potokować do polecenia wewnątrz polecenia FOR. Po raz pierwszy dowiedziałem się o tym z tego przykładu :

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

Ta zmodyfikowana wersja twojego kodu działa:

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

Możesz także użyć „więcej” wewnątrz polecenia FOR, jak opisano w tej odpowiedzi , aby przeanalizować dane wejściowe przesyłane z dowolnego polecenia:

C:\>ipconfig | findstr "Address" | for /f "tokens=14" %f in ('more') do @echo %f
192.168.x.x
192.168.y.y
Adam C.
źródło
10

Patrząc na dokumentację for(biegnij, for /?aby ją zobaczyć), nie sądzę, for /fże przeczytam z potoku. Jedynymi prawidłowymi źródłami są zestaw plików, „ciąg” i „polecenie”.

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]

Możesz umieścić polecenie w fornastępujący sposób:

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

192.168.x.x
192.168.y.y

(dzięki neurolizie za wskazanie, że musi być, ^|a nie tylko |)

Lub możesz spróbować wprowadzić ipconfig | findstr "Address"osobny skrypt wsadowy i wywołać:

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

(zakładając, że wywołałeś skrypt ipaddresses).

Możesz też użyć fordo wykonania tej pracy findstr:

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

192.168.x.x
192.168.y.y

nie jest dokładnie taki sam, ponieważ nie będzie pasował do adresów IPv6, ale coś w tym stylu mogłoby działać.

Zauważ też, że zmieniłem tokens=15na tokens=14. Myślę, że ostatnim polem na linii jest token 14. W każdym razie działa dla mnie.

Mikel
źródło
Jeśli spojrzysz na moje pytanie, zobaczysz, że wiem o używaniu pliku tymczasowego, to był mój przykład, właśnie nazwałem plik „a”. Z tym, co mówisz na początku, masz rację, najbliższą robieniem potoku jest umieszczenie polecenia w „in”. I przypuszczam, że skoro można to zrobić, to może wyjaśniać, dlaczego nie można użyć rury. Wygląda na to, że nie można do tego użyć rury. Interesujące jest również to, że wspominasz o nazwie potok. Nie słyszałem, by fajka go tak nazywała, ale Google to pokazuje.
barlop
4
Nawiasem mówiąc, powodem, dla którego „nie obsługuje rurociągów” jest to, że po prostu go nie uniknąłeś, forzamiast tego działa on w trybie potokowym ipconfig. Po prostu zrób for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f, kiedy ^jest ucieczka.
Matthieu Cartier
Dzięki neurolizie zaktualizuję moją odpowiedź, aby to uwzględnić.
Mikel
Cóż, miałem na myśli potok do For, jak wcześniej. Ale jestem przekonany, że nie można. Ale może w „in” jak w sugestii Mikela. Ale próbując linii Mikela, napotkałem problem z linią Mikela ... a ty (neuroliza) naprawiłeś to, uciekając z rury.
barlop
@barlop, tak, usunę sugestię pliku tymczasowego. „potok” jest terminem UNIX oznaczającym serię poleceń z potokami w środku.
Mikel