我有一个端口号列表,我想看看哪个程序正在使用该端口。我想过滤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
答案 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