Get-ChildItem: Enumerar archivos y carpetas con PowerShell

Recuerda los buenos viejos tiempos del comando dir de DOS? ¿Qué tal el comando ls de Linux? Si es así, el cmdlet Get-ChildItem es básicamente eso pero llevado al siguiente nivel.

De hecho, incluso tenemos dir y ls en PowerShell en forma de un alias. El cmdlet Get-ChildItem de PowerShell no solo puede listar archivos y carpetas en un sistema de archivos a través de la consola de PowerShell o un script de PowerShell, sino que también puede enumerar claves y valores de registro, certificados en varios almacenes de certificados e incluso Active Directory, por mencionar algunos.

Si eres un principiante o intermedio en el scripting de PowerShell, ¡asegúrate de consultar mi mini-curso GRATUITO sobre la construcción de una herramienta de PowerShell! Más de 9,000 palabras de explicación detallada e información sobre cómo construir una herramienta de PowerShell.

Para entender Get-ChildItem, primero piensa en él en relación a dir y ls, pero en lugar de solo archivos, trata muchos objetos como un elemento secundario y los enumera. Puedes usar el alias o el nombre completo del comando para utilizarlo.

Dado que este comando ha estado disponible desde PowerShell v1, puedes estar seguro de que funcionará con tu versión de PowerShell.

Get-ChildItem recorre un árbol

A file system is a hierarchy. It has a folder structure with files inside of folders and those folders inside of other folders. A file system is like a tree. That tree has a trunk (C:\ for example) and “branches” coming off of it (folders). In fact, we even have a tree command.

PS> tree
Folder PATH listing for volume HD
Volume serial number is 0000007B 22DC:666C
C:.
 \modules
   \AdsiPS
     \1.0.0.2
       \Public
       \AWSPowerShell
<SNIP>

Puedes apuntar este comando a rutas locales en la computadora local, utilizar un scriptblock remoto de PowerShell y usar Get-ChildItem dentro de él o simplemente apuntarlo a una ruta UNC. Todos funcionan de la misma manera. Tal vez solo quiero listar todos los archivos en el directorio actual.

PS> dir -Path .
PS> Invoke-Command -ComputerName SERVER1 -Scriptblock { dir -Path . }

Los proveedores de PowerShell

Microsoft se dio cuenta de que navegar por esta estructura “en forma de árbol” del sistema de archivos también podría aplicarse a otros sistemas. Un sistema de archivos “en forma de árbol” tiene carpetas y archivos, pero un registro tiene claves y valores, mientras que el sistema de certificados en Windows tiene almacenes y certificados dentro de esos almacenes. Cada una de estas áreas específicas puede representarse como un árbol, de ahí que naciera el proveedor de PowerShell. ¿Por qué toda esta charla sobre los proveedores de PowerShell? Porque el cmdlet Get-ChildItem es parte de los cmdlets *-Item que interactúan con las unidades de PowerShell que expone cada proveedor.

El cmdlet Get-ChildItem puede generar cualquier cantidad de objetos en una unidad de PowerShell y le permite procesar cada elemento a través del pipeline o quizás en un bucle foreach de PowerShell. Entiende el concepto de una unidad de PowerShell que le permite especificar una Ruta de una carpeta del sistema de archivos, una clave de registro o un almacén de certificados todo en uno.

Puedes ver a continuación que este comando puede enumerar la carpeta C:\, la raíz del Usuario Actual (HKEY Current User) así como el almacén de certificados de PowerShell.

PS> Get-ChildItem -Path C:\


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         7/2/2017   7:01 AM                AppData
d-----        4/25/2017   4:36 PM                CheckPoint

PS> Get-ChildItem -Path HKCU:\


    Hive: HKEY_CURRENT_USER


Name                           Property
----                           --------
BCD00000000

PS> dir -Path Cert:\


Location   : CurrentUser
StoreNames : {TrustedPublisher, ClientAuthIssuer, Root, UserDS...}

Filtrado

El comando Get-ChildItem de PowerShell no solo puede extraer todos los objetos en una unidad, sino que también puede filtrar la información a través de varios parámetros diferentes: Filter, Include y Exclude. Siempre querrás usar el ubicuo parámetro Filter de PowerShell cuando sea posible. Este parámetro pasa directamente la sintaxis de filtro al proveedor individual. Aunque mucho más rápido, esta sintaxis depende únicamente del proveedor que se esté consultando.

Por ejemplo, una sintaxis de Filter de Name -eq 'foo' puede ser completamente aceptable al consultar archivos, pero no funcionará en absoluto al consultar el registro porque ¡el proveedor de registro ni siquiera tiene un filtro!

PS> dir HKLM:\ -Filter "Name -eq 'foo'"
ls : Cannot call method. The provider does not support the use of filters.
At line:1 char:1 + ls HKLM:\ -Filter "Name -eq 'foo'" +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo          :
NotImplemented: (:) [Get-ChildItem], PSNotSupportedException     +
FullyQualifiedErrorId :
NotSupported,Microsoft.PowerShell.Commands.GetChildItemCommand

Sin embargo, cuando todo lo demás falla, siempre tienes los parámetros Include y Exclude también.

Este comando en PowerShell también tiene algunos parámetros específicos del sistema de archivos como Force, que mostrará archivos y carpetas ocultos, File y Directory, que solo encuentran archivos o carpetas. Echa un vistazo al desglose completo de Get-ChildItem a través de Get-Help o en la documentación de Microsoft.

Otra característica interesante de Get-ChildItem es su capacidad para resolver rutas cuando se utiliza el carácter comodín. En PowerShell, el carácter comodín generalmente representa cualquier cosa. Por ejemplo, si deseas ver todos los archivos con la extensión de archivo .txt, simplemente especifica la ruta a la carpeta y *.txt.

PS> Get-ChildItem -Path 'C:\*.txt'

Podríamos también filtrar por atributos de archivo. Tal vez solo queremos encontrar los archivos de solo lectura en una carpeta.

PS> Get-ChildItem -Path C:\ -Attributes R -File

Resumen

Este comando PowerShell es uno de esos cmdlets que usarás repetidamente. La mayor parte del tiempo, probablemente estarás utilizando el proveedor FileSystem, pero es importante recordar que este cmdlet es capaz de mucho más. Úsalo para consultar archivos, carpetas, claves de registro, valores de registro, certificados, usuarios de Active Directory, computadoras o incluso variables de entorno, funciones ¡y más!

Cuando tengas dudas, ejecuta el comando Get-PSDrive para ver una lista de todas las unidades de PowerShell cargadas que Get-ChildItem puede consultar por ti.

Source:
https://adamtheautomator.com/get-childitem/