2016-11-18 95 views
1

我有一個端口號列表,我想查看哪個程序正在使用該端口。我想過濾Get-Networkstatistics cmdlet,只顯示port.txt文件中的某些端口。我修改了針對cmdlet循環遍歷每個項目

Get-NetworkStatistics | Select-Object ComputerName, LocalPort, ProcessName 

只循環通過我提供的端口號。但是,$result變量沒有存儲任何內容,輸出爲空。我究竟做錯了什麼?

$file = .\ports.txt 

foreach ($port in $file) 
{ 
    $result += Get-NetworkStatistics | 
       Select-Object ComputerName, LocalPort, ProcessName | 
       Where-Object {$_.LocalPort -eq $port} 
} 
$result | Export-Csv .\networkports.csv 

回答

1

首先,你要在做選擇之前進行過濾,這樣你就必須選擇較低的對象。

$result = @() #array 
foreach ($port in $file) 
{ 
$result += Get-NetworkStatistics | Where-Object {$_.LocalPort -eq $port} | Select-Object ComputerName, LocalPort, ProcessName 
} 
$result | Export-Csv .\networkports.csv 

至於實際問題本身,我認爲這是由於scoping。你需要在循環之前聲明變量,所以它可以在循環中和循環之後使用。

+0

它現在正在工作!感謝:D –

+0

是的,它確實!它的工作原理 –

2

你必須使用Get-Content命令: $file = Get-Content "path_to_ports.txt'

+1

是我錯過了gc,它現在正在工作!感謝:D –

1

聲明

$file = .\ports.txt 

不文件讀入到變量。爲此,使用Get-Content

另外,您不需要循環。 Get-Content讀取輸入文件轉換成字符串數組,所以如果列表中包含一個給定的本地端口可以使用-contains操作檢查:

$ports = Get-Content '.\ports.txt' 
Get-NetworkStatistics | 
    Where-Object { $ports -contains $_.LocalPort } | 
    Select-Object ComputerName, LocalPort, ProcessName | 
    Export-Csv '.\networkports.csv' -NoType 

在PowerShell的V3或更高版本,你也可以使用-in運營商,對大多數用戶來說感覺有點「自然」:

$ports = Get-Content '.\ports.txt' 
Get-NetworkStatistics | 
    Where-Object { $_.LocalPort -in $ports } | 
    Select-Object ComputerName, LocalPort, ProcessName | 
    Export-Csv '.\networkports.csv' -NoType