Out-File仅显示最后一行

时间:2016-11-01 20:22:55

标签: powershell

我正在尝试将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
  }
}

3 个答案:

答案 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

    }