varios - Pasa el cursor por los archivos en un directorio usando PowerShell
renombrar carpetas por lote (4)
¿Cómo puedo cambiar el siguiente código para ver todos los archivos .log en el directorio y no solo el archivo?
Necesito recorrer todos los archivos y eliminar todas las líneas que no contengan "step4" o "step9". Actualmente esto creará un nuevo archivo, pero no estoy seguro de cómo usarlo for each
ciclo aquí (novato).
Los archivos reales se nombran así: 2013 09 03 00_01_29.log . Me gustaría que los archivos de salida los sobrescriban, o que tengan el MISMO nombre, junto con "salir".
$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
Otras respuestas son geniales, solo quiero agregar ... un enfoque diferente utilizable en PowerShell: Instalar utilidades GNUWin32 y usar grep para ver las líneas / redirigir la salida al archivo http://gnuwin32.sourceforge.net/
Esto sobrescribe el nuevo archivo cada vez:
grep "step[49]" logIn.log > logOut.log
Esto agrega la salida de registro, en caso de que sobrescriba el archivo de inicio de sesión y desee conservar los datos:
grep "step[49]" logIn.log >> logOut.log
Nota: para poder usar utilidades GNUWin32 globalmente, debe agregar la carpeta bin a la ruta del sistema.
Para obtener el contenido de un directorio, puede usar
$files = Get-ChildItem "C:/Users/gerhardl/Documents/My Received Files/"
Entonces 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
}
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'')
}
Si necesita realizar un bucle dentro de un directorio de forma recursiva para un tipo particular de archivo, use el siguiente comando, que filtra todos los archivos del tipo de archivo doc
.
$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc
Si necesita filtrar en varios tipos, use el siguiente comando.
$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc,*.pdf
Ahora la variable $fileNames
actúa como una matriz desde la que puede hacer un bucle y aplicar su lógica comercial.