ฉันจะไพพ์ไปยังคำสั่ง“ สำหรับ” ได้อย่างไร


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จะอ่านจากไปป์ แหล่งข้อมูลที่ถูกต้องเท่านั้นคือชุดไฟล์ "string" และ '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]

คุณสามารถใส่คำสั่งในforลักษณะนี้:

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

192.168.x.x
192.168.y.y

(ขอบคุณ neurolysis สำหรับการชี้ให้เห็นว่ามันจะต้องเป็น^|และไม่ใช่แค่|)

หรือคุณอาจลองใส่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 แสดงให้เห็น
barlop

4
สำหรับบันทึกเหตุผลที่ "ดูเหมือนจะไม่สนับสนุนท่อ" เป็นเพียงเพราะคุณไม่ได้หนีออกมามันเป็นท่อแทนfor ipconfigเพียงแค่ทำfor /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %fเมื่อ^เป็นตัวละครที่หลบหนี
Matthieu Cartier

ขอบคุณ neurolysis จะอัพเดตคำตอบของฉันเพื่อรวมไว้
Mikel

ฉันหมายถึงการไพพ์ถึงสำหรับเช่นก่อนหน้านี้ แต่ฉันมั่นใจว่าไม่สามารถ แต่สามารถใน "ใน" ตามคำแนะนำของมิเคล แต่ลองใช้สายของมิเคลฉันเจอปัญหากับสายของมิเคล .. และคุณ (neurolysis) แก้ไขปัญหานี้โดยการหลบหนีท่อ
barlop

@barlop ใช่ฉันจะลบคำแนะนำ tempfile "ไปป์" เป็นคำ UNIX หมายถึงชุดคำสั่งที่มีไพพ์อยู่ตรงกลาง
Mikel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.