Có điều gì giống như một đường ống hoặc tương tự mà tôi có thể sử dụng trên HĐH Windows để chạy lệnh này trong một dòng không?
Cả hai cmd.exe
và PowerShell hỗ trợ các đường ống từ lệnh này sang lệnh khác. Trong PowerShell, một cái gì đó giống như (cái này phải nằm trên một dòng trên dòng lệnh hoặc sử dụng `để thoát dòng mới trong tập lệnh):
netstat -ano
| select -skip 4
| % {$a = $_ -split ' {3,}'; New-Object 'PSObject' -Property @{Original=$_;Fields=$a}}
| ? {$_.Fields[1] -match '15120$'}
| % {taskkill /F /PID $_.Fields[4] }
Ở đâu:
Select -skip 4
bỏ qua bốn dòng tiêu đề đầu tiên. ( Select
viết tắt của từ Select-Object
được sử dụng để thực hiện SQL SELECT giống như các dự án của các đối tượng.
%
là viết tắt để Foreach-Object
thực hiện một khối tập lệnh trên mỗi đối tượng ( $_
) trong đường ống và đưa ra kết quả của khối tập lệnh vào đường ống. Ở đây, đầu tiên, phân tách đầu vào thành một mảng các trường và sau đó tạo một đối tượng mới với hai thuộc tính Original
chuỗi từ netstat
và Fields
mảng vừa tạo.
?
là viết tắt của Where-Object
các bộ lọc dựa trên kết quả của một khối tập lệnh. Ở đây khớp với biểu thức chính ở cuối trường thứ hai (tất cả các thùng chứa PowerShell đều dựa trên số không).
(Tất cả được kiểm tra ngoại trừ yếu tố cuối cùng: Tôi không muốn bắt đầu quá trình tiêu diệt :-)).
Trong thực tế tôi sẽ đơn giản hóa điều này, ví dụ. chỉ trả về 0 hoặc PID từ lần đầu tiên foreach
(sẽ được thiết kế để bỏ qua các tiêu đề) và lọc theo giá trị không bằng 0 trước khi gọi taskkill
. Điều này sẽ nhanh hơn để nhập nhưng khó theo dõi hơn mà không biết PowerShell.
findstr
(Windowsgrep
). Ví dụ :netstat -a -o -n | findstr "LISTENING" | findstr ":135"
. Có lẽ điều này giúp bạn tiến một bước gần hơn;)