bagaimana cara pipa ke perintah "untuk"?

11

Bagaimana cara menyalurkan ke perintah for. Jadi, bukannya

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

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

Saya ingin dapat melakukannya di satu jalur.

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

Jawaban:

22

Meskipun tampaknya tidak didokumentasikan, Anda dapat menyalurkan ke perintah di dalam perintah FOR. Saya pertama kali mempelajarinya dari contoh ini :

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

Versi kode Anda yang dimodifikasi ini berfungsi:

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

Anda juga dapat menggunakan "lebih" di dalam perintah FOR, seperti yang dijelaskan dalam jawaban ini , untuk mengurai input yang disalurkan dari perintah sewenang-wenang:

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

Melihat dokumentasi untuk for(lari for /?untuk melihatnya), saya tidak berpikir for /fakan membaca dari pipa. Satu-satunya sumber yang valid adalah file-set, "string", dan 'command'.

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]

Anda bisa memasukkan perintah ke dalam forseperti ini:

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

192.168.x.x
192.168.y.y

(Berkat neurolisis untuk menunjukkan itu harus ^|dan bukan hanya |)

Atau Anda dapat mencoba memasukkan ipconfig | findstr "Address"skrip batch terpisah dan menelepon:

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

(dengan asumsi Anda memanggil skrip ipaddresses).

Atau Anda dapat menggunakan foruntuk melakukan pekerjaan findstrjuga, seperti ini:

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

192.168.x.x
192.168.y.y

itu tidak persis sama karena tidak akan cocok dengan alamat IPv6, tetapi sesuatu di sepanjang garis itu bisa berfungsi.

Perhatikan juga bahwa saya berubah tokens=15menjadi tokens=14. Saya pikir bidang terakhir pada baris adalah token 14. Tetap bekerja untuk saya.

Mikel
sumber
Jika Anda melihat pertanyaan saya, Anda akan melihat saya tahu tentang menggunakan file temp, itu adalah contoh saya, saya baru saja memanggil file 'a'. Dengan apa yang Anda katakan di awal, Anda ada benarnya, yang paling dekat dengan melakukan pipa .. adalah menempatkan perintah di "dalam". Dan saya kira karena seseorang dapat melakukan itu, itu mungkin menjelaskan mengapa seseorang tidak dapat menggunakan pipa. Sepertinya orang tidak bisa menggunakan pipa untuk itu. Menarik juga Anda menyebutkan istilah pipeline .. Saya belum pernah mendengar pipanya memanggil itu .. tetapi sebuah google menunjukkannya.
barlop
4
Sebagai catatan, alasannya "sepertinya tidak mendukung jaringan pipa" adalah hanya karena Anda belum menghindarinya, itu adalah perpipaan foralih-alih ipconfig. Lakukan saja for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f, kapan ^karakter pelariannya.
Matthieu Cartier
Terima kasih neurolisis, akan memperbarui jawaban saya untuk memasukkannya.
Mikel
Ya maksud saya perpipaan untuk, seperti sebelumnya. Tapi saya yakin tidak bisa. Namun bisa di "in" seperti dalam anjuran Mikel. Tetapi mencoba garis Mikel, saya memang mengalami masalah dengan garis Mikel .. dan Anda (neurolisis) memperbaikinya dengan melarikan diri dari pipa.
barlop
@barlop, ya, saya akan menghapus saran tempfile. "pipeline" adalah istilah UNIX yang berarti serangkaian perintah dengan pipa di tengah.
Mikel