Script para recorrer archivos y carpetas – informaticamadridmayor

En este artículo, veremos ejemplos del uso de construcciones para recorrer todos los archivos y carpetas en un disco o en un directorio específico (usando las instrucciones For-Each y Get-ChildItem). Puede usarlos ampliamente en sus scripts de PowerShell.

Por lo general, la tarea de iterar sobre todos los objetos del sistema de archivos en un directorio surge cuando necesita realizar una determinada acción con todos los objetos anidados. Por ejemplo, debe eliminar, copiar, mover archivos, agregar o reemplazar líneas en todos los archivos en el directorio específico según algunos criterios.

Para obtener una lista de objetos secundarios (carpetas y archivos) en un directorio, use el cmdlet de PowerShell Get-ChildItem. Este es el cmdlet de sistema de archivos más popular. Hay varios alias para ChildItem: gci, dir, ls.

El cmdlet Get-ChildItem muestra una lista de objetos secundarios (anidados) en una unidad o directorio especificado. La ruta al directorio se especifica a través del atributo –Path.

Por ejemplo, para enumerar los archivos en el directorio C:PS, ejecute el comando:

Get-ChildItem -Path ‘C:PS’

powershell get-childitem para cada

Sin embargo, muestra una lista de objetos ubicados en la raíz del directorio especificado. También puede mostrar el contenido de los directorios secundarios (subdirectorios) usando el parámetro –Recurse:

Get-ChildItem -Path ‘C:PS’ –Recurse

Como puede ver, los contenidos de cada subdirectorio se muestran secuencialmente.

get-childitem foreach

Ahora, veamos la estructura general del bucle ForEach cuando se usa el cmdlet Get-ChildItem:

Get-ChildItem –Path "C:PS" |

Foreach-Object {

#Do something with $_.FullName

}

Además, puede usar una estructura de bucle de este tipo (pero nos gusta menos):

foreach($file in Get-ChildItem $SomeFolder)

{

# Do something

}

Por ejemplo, puede eliminar todos los archivos con la extensión *.log en el directorio especificado y todas las subcarpetas (realmente no eliminaremos los archivos del disco agregando el parámetro WhatIF):

Get-ChildItem –Path "C:PS" -Recurse -Filter *.log

|

Foreach-Object {

Remove-Item $_.FullName -WhatIF

}

El script encontró 3 archivos con la extensión *.log e indicó que este script podría eliminarlos.

archivo powershell foreach en la carpeta

Elimine archivos con más de xx días usando PowerShell

Considere una secuencia de comandos que elimine archivos con más de 10 días de antigüedad en un directorio (se puede usar cuando necesite limpiar la carpeta de registros o las carpetas de la red pública). Usamos el cmdlet Where-Object para filtrar objetos:

Get-ChildItem C:ps -Recurse |

Where-Object { $_.CreationTime -lt ($(Get-Date).AddDays(-10))} |

ForEach-Object { remove-Item $_.FullName –whatif }

Eliminar directorios vacíos recursivamente con PowerShell

O puede recorrer todos los subdirectorios y carpetas y subcarpetas vacías, si existen:

Get-ChildItem C:ps -Recurse -Force -ea 0 |Where-Object {$_.PsIsContainer -eq $True} |{$_.getfiles().count -eq 0} |

ForEach-Object {

$_ | del -Force

}

Encuentre archivos grandes y muévalos a una carpeta diferente

El siguiente ejemplo encontrará todos los archivos * .iso de más de 1 GB en la unidad del sistema C: y los moverá a otra partición.

Primero, configuremos el tamaño de archivo requerido (1 GB):

$filesize=1024*1024*1024

Ahora vamos a recorrer los archivos y moverlos al directorio de destino:

Get-ChildItem C:* -Include *.iso -Recurse |Where-Object { $_.Length -gt $filesize} |ForEach-Object { Move-Item $_.FullName D:ISO -whatif}

Recorra archivos de texto en un directorio usando PowerShell

El siguiente ejemplo de bucle de archivo permite encontrar archivos que contienen el texto ‘flush_log’ o ‘error’ para todos los archivos *.log en el directorio, y guarda las líneas encontradas en archivos con una nueva extensión (_outlog):

$files = Get-ChildItem C:ps -Recurse *.log

foreach ($f in $files){

$outfile = $f.FullName + "_outlog"

Get-Content $f.FullName | Where-Object { ($_ -match 'flush_log' -or $_ -match 'error') } | Set-Content $outfile

}

Tal secuencia de comandos de PowerShell puede ser útil al buscar entradas de eventos específicos en archivos de registro y filtrar todo lo que no sea necesario. Además, puede usar este código PS en otros escenarios cuando necesite recorrer archivos, leer el contenido y hacer algo con él.

Descubra qué usuario está bloqueando un archivo en una carpeta compartida

Puede usar un bucle foreach para encontrar al usuario que abre un archivo específico en un recurso compartido de red a través de SMB. En este ejemplo, nos conectaremos a una computadora remota (host SMB) usando CIMSession y recorreremos los archivos abiertos:

$filename="*annualreport.xlsx*"

$sess = New-CIMSession –Computername ny-fs01

$files = Get-SMBOpenFile -CimSession $sess

foreach ($file in $files)

{

if ($file.path -like $filename)

{

$archivo | seleccione la ruta, ClientUserName | Florida

}

}

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *