2016-11-01 3 views
1

Ich versuche netstat Ausgabe in eine Out-Datei zu bekommen. Das Skript funktioniert gut ohne die Out-File, ich sehe alles auf der Konsole. Wenn ich jedoch Out-File verwende, sehe ich nur die letzte Zeile.Out-File zeigt nur die letzte Zeile

$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

Wenn eine Antwort Ihr Problem löst, bitte übernehmen, indem die große Häkchen klicken (✓) neben ihm und gegebenenfalls auch bis-Abstimmung es (bis-Abstimmung erfordert mindestens 15 Rating-Punkte). Wenn Sie andere Antworten hilfreich fanden, stimmen Sie sie bitte ab. Akzeptieren und Up-Voting hilft zukünftigen Lesern. Weitere Informationen finden Sie in [dem entsprechenden Hilfeartikel] (http://stackoverflow.com/help/someone-answers). Wenn Ihre Frage noch nicht vollständig beantwortet wurde, geben Sie bitte Feedback. – mklement0

Antwort

2

Ihr Out-File ist an der falschen Stelle. Sie schreiben nur den Wert, der der Eigenschaft Associated DLLs and File Path der Ausgabedatei zugewiesen werden sollte, und Sie überschreiben die Datei bei jeder Iteration der Schleife.

Die einfache Lösung ist Out-Filenach die New-Object (nicht auf dem Grundstück hashtable wie Sie es jetzt haben) zu setzen, und fügen Sie den Parameter -Append, wie @Esperento57 in seiner Antwort zeigte.

Persönlich würde ich lieber die foreach zu einer ForEach-Object ändern, obwohl, so dass Sie alles in einer Pipeline haben und am Ende ausgeben können, ohne in einer Schleife anhängen zu müssen. Möglicherweise möchten Sie auch vermeiden, dass Prozesse für mehrere Eigenschaften wiederholt aufgelistet werden.

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' 
+0

Danke Ansgar für das Verlassen meiner Lösung, guten Tag für Sie – Esperento57

0

wie dieser Hinweis

$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 

    } 
1

ändern, wie Sie Out-Fileinnerhalb einer Schleife sind aufgerufen wird.

daher - in Abwesenheit des -Append Schalter - die Datei wird neu geschrieben in jeder Iteration statt - angehängt.

Für einen besseren Ansatz zur Lösung Ihres Problems, siehe Ansgar Wiechers' helpful answer.

Verwandte Themen