Recorrer archivos en un directorio usando PowerShell
¿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 each
bucle 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
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')
}
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 foreach
bucle (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
}
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 doc
tipo 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 $fileNames
la variable actúa como una matriz desde la cual puede realizar un bucle y aplicar su lógica empresarial.