it-swarm.com.de

Durchlaufen Sie Dateien in einem Verzeichnis mit PowerShell

Wie kann ich den folgenden Code ändern, um alle .log-Dateien im Verzeichnis und nicht nur die eine Datei anzuzeigen?

Ich muss alle Dateien durchlaufen und alle Zeilen löschen, die nicht "step4" oder "step9" enthalten. Derzeit wird eine neue Datei erstellt, aber ich bin nicht sicher, wie ich die for each -Schleife hier verwenden soll (Neuling).

Die tatsächlichen Dateien haben folgenden Namen: 2013 09 03 00_01_29.log. Ich möchte, dass die Ausgabedateien entweder überschrieben werden oder der gleiche Name mit "out" angehängt wird.

$In = "C:\Users\gerhardl\Documents\My Received Files\Test_In.log"
$Out = "C:\Users\gerhardl\Documents\My Received Files\Test_Out.log"
$Files = "C:\Users\gerhardl\Documents\My Received Files\"

Get-Content $In | Where-Object {$_ -match 'step4' -or $_ -match 'step9'} | `
Set-Content $Out
206
user2725402

Probieren Sie es aus:

Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files" -Filter *.log | 
Foreach-Object {
    $content = Get-Content $_.FullName

    #filter and save content to the original file
    $content | Where-Object {$_ -match 'step[49]'} | Set-Content $_.FullName

    #filter and save content to a new file 
    $content | Where-Object {$_ -match 'step[49]'} | Set-Content ($_.BaseName + '_out.log')
}
313
Shay Levy

Um den Inhalt eines Verzeichnisses abzurufen, können Sie verwenden

$files = Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files\"

Dann können Sie auch diese Variable durchlaufen:

for ($i=0; $i -lt $files.Count; $i++) {
    $outfile = $files[$i].FullName + "out" 
    Get-Content $files[$i].FullName | Where-Object { ($_ -match 'step4' -or $_ -match 'step9') } | Set-Content $outfile
}

Eine noch einfachere Möglichkeit, dies zu formulieren, ist die foreach -Schleife (dank @Soapy und @MarkSchultheiss):

foreach ($f in $files){
    $outfile = $f.FullName + "out" 
    Get-Content $f.FullName | Where-Object { ($_ -match 'step4' -or $_ -match 'step9') } | Set-Content $outfile
}
64
PVitt

Wenn Sie ein Verzeichnis für einen bestimmten Dateityp rekursiv durchlaufen müssen, verwenden Sie den folgenden Befehl, mit dem alle Dateien des Dateityps doc gefiltert werden

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc

Wenn Sie die Filterung nach mehreren Typen durchführen müssen, verwenden Sie den folgenden Befehl.

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc,*.pdf

Jetzt fungiert die Variable $fileNames als Array, von dem aus Sie eine Schleife ausführen und Ihre Geschäftslogik anwenden können.

23
Sarath Avanavu