我正在尝试将netstat
输出到输出文件中。该脚本在没有Out-File
的情况下运行良好,我在控制台上看到了所有内容。但是,当我使用Out-File
时,我只看到最后一行。
$ComputerName = Read-Host -Prompt 'Please Input Computer Name'
$cmd = netstat -nao | Select-String "ESTA"
foreach ($element in $cmd) {
$data = $element -split ' ' | where {$_ -ne ''}
New-Object -TypeName PSObject -Property @{
'Local IP : Port#' = $data[1];
'Remote IP : Port#' = $data[2];
'Process ID' = $data[4];
'Process Name' = ((Get-Process | where {$_.ID -eq $data[4]})).Name
'Process File Path' = ((Get-Process | where {$_.ID -eq $data[4]})).Path
'Process Start Time' = ((Get-Process | where {$_.ID -eq $data[4]})).StartTime
#'Process File Version' = ((Get-Process | where {$_.ID -eq $data[4]})).FileVersion
'Associated DLLs and File Path' = ((Get-Process | where {$_.ID -eq $data[4]})).Modules |
select @{Name='Module';Expression={$_.Filename -join '; '}} |
Out-File -FilePath c:\temp\net.txt
}
}
答案 0 :(得分:2)
您的Out-File
位置错误。您只应将应分配给属性Associated DLLs and File Path
的值写入输出文件,并在每次循环迭代时覆盖该文件。
简单的解决方案是将Out-File
放在 New-Object
之后(不在你现在的属性哈希表中),并添加参数-Append
,正如@Esperento57在他的回答中所表明的那样。
我个人更喜欢将foreach
更改为ForEach-Object
,因此您可以将所有内容都放在一个管道中,并且可以在最后输出而无需附加循环。您可能还希望避免为多个属性重复枚举进程。
netstat -nao | Select-String 'ESTA' -SimpleMatch | ForEach-Object {
$data = $_ -split '\s+'
$proc = Get-Process -Id $data[4]
New-Object -Type PSObject -Property @{
'Local IP : Port#' = $data[1];
'Remote IP : Port#' = $data[2];
'Process ID' = $data[4];
'Process Name' = $proc.Name
'Process File Path' = $proc.Path
'Process Start Time' = $proc.StartTime
#'Process File Version' = $proc.FileVersion
'Associated DLLs and File Path' = $proc.Modules |
Select-Ojbect @{Name='Module';Expression={$_.Filename -join ';'}}
}
} | Set-Content 'C:\temp\net.txt'
答案 1 :(得分:1)
请注意您如何在循环中调用Out-File
。
因此 - 在没有-Append
开关的情况下 - 文件在每次迭代中都被重写而不是附加到。
要更好地解决问题,请参阅Ansgar Wiechers' helpful answer。
答案 2 :(得分:0)
像这样修改
$cmd = netstat -nao | select-string "ESTA"
foreach ($element in $cmd)
{
$data = $element -split ' ' | where {$_ -ne ''}
New-Object -TypeName psobject -Property @{
'Local IP : Port#'=$data[1];
'Remote IP : Port#'=$data[2];
'Process ID'= $data[4];
'Process Name'=((Get-process |where {$_.ID -eq $data[4]})).Name;
'Process File Path'=((Get-process |where {$_.ID -eq $data[4]})).path;
'Process Start Time'=((Get-process |where {$_.ID -eq $data[4]})).starttime;
#'Process File Version'=((Get-process |where {$_.ID - eq$data[4]})).FileVersion
'Associated DLLs and File Path'=((Get-process |where {$_.ID -eq $data[4]})).Modules |select @{Name='Module';Expression={$_.filename -join '; '} }
} |out-file -FilePath c:\temp\net.txt -Append
}