มีสิ่งใดเช่นไพพ์หรือคล้ายกันที่ฉันสามารถใช้บน Windows OS เพื่อรันคำสั่งนี้ในหนึ่งบรรทัด?
ทั้งสองcmd.exe
และ PowerShell สนับสนุนไพพ์จากคำสั่งหนึ่งไปอีกคำสั่งหนึ่ง ใน PowerShell มีลักษณะดังนี้ (ควรเป็นบรรทัดเดียวในบรรทัดคำสั่งหรือใช้ `เพื่อ escapte บรรทัดใหม่ในสคริปต์):
netstat -ano
| select -skip 4
| % {$a = $_ -split ' {3,}'; New-Object 'PSObject' -Property @{Original=$_;Fields=$a}}
| ? {$_.Fields[1] -match '15120$'}
| % {taskkill /F /PID $_.Fields[4] }
ที่ไหน:
Select -skip 4
ข้ามบรรทัดส่วนหัวสี่บรรทัดแรก ( Select
สั้นสำหรับSelect-Object
ใช้ในการดำเนินการ SQL SELECT เหมือนโครงการของวัตถุ
%
สั้นForeach-Object
ที่ดำเนินการบล็อกสคริปต์ในแต่ละวัตถุ ( $_
) ในไปป์ไลน์และส่งผลลัพธ์ผลลัพธ์ของบล็อกสคริปต์ไปยังไปป์ไลน์ นี่คือการแบ่งอินพุตเป็นอาร์เรย์ของเขตข้อมูลก่อนแล้วจึงสร้างวัตถุใหม่ที่มีคุณสมบัติสองOriginal
รายการที่สตริงจากnetstat
และFields
อาร์เรย์เพิ่งสร้างขึ้น
?
สั้นWhere-Object
ที่ตัวกรองจะขึ้นอยู่กับผลลัพธ์ของบล็อกสคริปต์ ที่นี่จับคู่ regex ที่ส่วนท้ายของฟิลด์ที่สอง (PowerShell ทั้งหมดคอนเทนเนอร์ตามศูนย์)
(ทดสอบทั้งหมดยกเว้นองค์ประกอบสุดท้าย: ฉันไม่ต้องการเริ่มกระบวนการฆ่า :-))
ในทางปฏิบัติฉันจะทำให้สิ่งนี้ง่ายขึ้นเช่น กลับมาเพียง 0 หรือ PID จากครั้งแรกforeach
(ซึ่งจะได้รับการออกแบบที่จะไม่สนใจส่วนหัว) taskkill
และกรองค่าไม่เป็นศูนย์ก่อนที่จะเรียก สิ่งนี้จะพิมพ์ได้เร็วขึ้น แต่ยากที่จะติดตามโดยไม่ทราบว่า PowerShell
findstr
(Windowsgrep
) ตัวอย่างเช่นnetstat -a -o -n | findstr "LISTENING" | findstr ":135"
. บางทีนี่อาจทำให้คุณใกล้ขึ้นอีกขั้นหนึ่ง)