围绕cmdlet遍历每个项目

时间:2016-11-18 21:14:21

标签: powershell

我有一个端口号列表,我想看看哪个程序正在使用该端口。我想过滤Get-Networkstatistics cmdlet,只显示port.txt文件中的某些端口。我修改了

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

3 个答案:

答案 0 :(得分:2)

您必须使用Get-Content cmdlet: $file = Get-Content "path_to_ports.txt'

答案 1 :(得分:1)

首先,你想在做Select之前进行过滤,这样就必须选择较低的对象。

$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。你需要在循环之前声明变量,因此它在循环中和循环之后可用。

答案 2 :(得分: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