Recorrer archivos en un directorio usando PowerShell

Resuelto user2725402 asked hace 11 años • 3 respuestas

¿Cómo puedo cambiar el siguiente código para ver todos los archivos .log en el directorio y no solo un archivo?

Necesito recorrer todos los archivos y eliminar todas las líneas que no contengan "paso4" o "paso9". Actualmente, esto creará un archivo nuevo, pero no estoy seguro de cómo usar el for eachbucle aquí (novato).

Los archivos reales se denominan así: 2013 09 03 00_01_29.log . Me gustaría que los archivos de salida los sobrescriban o que tengan el MISMO nombre, al que se le añade "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
user2725402 avatar Sep 17 '13 17:09 user2725402
Aceptado

Prueba esto:

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')
}
Shay Levy avatar Sep 17 '2013 11:09 Shay Levy

Para obtener el contenido de un directorio puede utilizar

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

Luego también puedes recorrer esta variable:

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
}

Una forma aún más sencilla de poner esto es el foreachbucle (gracias a @Soapy y @MarkSchultheiss):

foreach ($f in $files){
    $outfile = $f.FullName + "out" 
    Get-Content $f.FullName | Where-Object { ($_ -match 'step4' -or $_ -match 'step9') } | Set-Content $outfile
}
PVitt avatar Sep 17 '2013 10:09 PVitt

Si necesita recorrer un directorio de forma recursiva para un tipo de archivo en particular, use el siguiente comando, que filtra todos los archivos de doctipo de archivo

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

Si necesita realizar el filtrado en varios tipos, utilice el siguiente comando.

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

Ahora $fileNamesla variable actúa como una matriz desde la cual puede realizar un bucle y aplicar su lógica empresarial.

Sarath Subramanian avatar Apr 28 '2016 15:04 Sarath Subramanian