Passare in rassegna i file in una directory usando PowerShell

Come posso modificare il seguente codice per esaminare tutti i file .log nella directory e non solo l’unico file?

Ho bisogno di scorrere tutti i file e cancellare tutte le righe che non contengono “step4” o “step9”. Attualmente questo creerà un nuovo file, ma non sono sicuro di come utilizzare qui for each ciclo (newbie).

I file effettivi sono denominati in questo modo: 2013 09 03 00_01_29.log . Mi piacerebbe che i file di output li sovrascrivessero o che avessero il nome SAME, aggiunto con “out”.

 $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 

Fare un tentativo:

 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') } 

Per ottenere il contenuto di una directory che è ansible utilizzare

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

Quindi puoi anche eseguire il loop su questa variabile:

 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 } 

Se è necessario eseguire il ciclo all’interno di una directory in modo ricorsivo per un particolare tipo di file, utilizzare il comando seguente, che filtra tutti i file del tipo di file doc

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

Se hai bisogno di fare la filtrazione su più tipi, usa il comando seguente.

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

Ora la variabile $fileNames funge da matrice da cui è ansible eseguire il ciclo e applicare la logica aziendale.

Altre risposte sono grandiose, voglio solo aggiungere … un diverso approccio utilizzabile in PowerShell: Installa gli utilit GNUWin32 e usa grep per visualizzare le linee / redirect l’output sul file http://gnuwin32.sourceforge.net/

Questo sovrascrive il nuovo file ogni volta:

 grep "step[49]" logIn.log > logOut.log 

Questo accoda l’output del log, nel caso in cui si sovrascriva il file logIn e si desidera conservare i dati:

 grep "step[49]" logIn.log >> logOut.log 

Nota: per poter utilizzare i programmi di utilità GNUWin32 a livello globale è necessario aggiungere la cartella bin al percorso di sistema.