Los proveedores de PowerShell son programas basados en .NET que nos permiten trabajar con almacenes de datos como si fueran unidades de discos montadas, haciéndolos disponibles en PowerShell para poder verlos y administrarlos fácilmente. Esto simplifica el acceso a datos externos, fuera del entorno de PowerShell. Por ejemplo, podemos acceder al registro de Windows, como si fuera un sistema de archivos. Esto significa, ser capaces de usar los cmdlets como si estuviéramos trabajando con archivos y carpetas, como se muestra en la siguiente tabla: A continuación la lista completa de cmdlets disponibles para los proveedores de PowerShell:

Cmdlet Alias Cmd equiv Descripción Tipo de Cmdlet
Get-Location gl pwd Ubicación de trabajo actual Ubicación
Set-Location sl cd, chdir Establece la ubicación de trabajo actual en una ubicación especificada Ubicación
Pop-Location popd n/a Cambia la ubicación actual por la última ubicación que entró en la pila. Puede obtener la ubicación de la pila predeterminada o de una pila creada mediante el cmdlet Push-Location. Ubicación
Push-Location pushd n/a Agrega la ubicación actual al principio de una lista de ubicaciones ("pila”) Ubicación
Copy-Item cpi copy Copia un elemento de una ubicación a otra en un espacio de nombres. Cmdlet de Elementos
Remove-Item ri del Elimina los elementos especificados. Cmdlet de elementos
Move-Item mi move Mover un elemento Cmdlet de elementos
Rename-Item rni rn Renombrar un elemento Cmdlet de elementos
New-Item ni mkdir Crea un nuevo elemento Cmdlet de elementos
Clear-Item cli n/a Elimina el contenido de un elemento, pero no elimina el elemento.

 

Cmdlet de elementos
Get-Item gi n/a Obtiene el elemento de la ubicación especificada Cmdlet de elementos
Set-Item si n/a Cambia el valor de un elemento por le valor especificado en el comando. Cmdlet de elementos
Invoke-Item ii n/a Realiza la acción predeterminada en el elemento especificado. Cmdlet de elementos
Add-content ac n/a Agrega contenido a los elementos especificados, como por ejemplo palabras a un archivo Cmdlet de contenido
Clear-content clc n/a Elimina el contenido de un elemento (por ejemplo, elimina el texto de un archivo), pero no elimina el elemento en sí. Cmdlet de contenido
Get-Content gc type Obtiene el contenido del elemento en la ubicación especificada. Cmdlet de contenido
Set-Content sc n/a Escribe o reemplaza el contenido de un elemento por contenido nuevo. Cmdlet de contenido
Get-ChildItem gci dir, ls Obtiene los elementos y los elementos secundarios de una o más ubicaciones especificadas.

 

Cmdlet childitem
Clear-ItemProperty clp n/a Elimina el valor de una propiedad pero no elimina la propiedad en sí. Cmdlet ItemProperty
Copy-ItemProperty cpp n/a Copia una propiedad y su valor desde una ubicación especificada a otra ubicación. Cmdlet ItemProperty
Get-ItemProperty gp n/a Obtiene las propiedades de un elemento especificado. Cmdlet ItemProperty
Move-ItemProperty mp n/a Mueve una propiedad de una ubicación a otra. Cmdlet ItemProperty
New-ItemProperty n/a n/a Crea una nueva propiedad para un elemento especificado y establece su valor. Normalmente, este cmdlet se utiliza para crear nuevos valores del Registro, porque los valores del Registro son propiedades de un elemento de clave del Registro. Cmdlet ItemProperty
Remove-ItemProperty rp n/a Elimina la propiedad y su valor de un elemento. Cmdlet ItemProperty
Rename-ItemProperty rnp n/a Cambia el nombre de una propiedad de un elemento. Cmdlet ItemProperty
Set-ItemProperty sp n/a Crea o cambia el valor de una propiedad de un elemento. Cmdlet ItemProperty
Join-Path n/a n/a Combina una ruta y una ruta secundaria en una sola ruta. El proveedor especifica los delimitadores de ruta. Cmdlets de Rutas
Convert-Path cvpa n/a Convierte una ruta de Windows PowerShell a una ruta de proveedor de Windows PowerShell. Cmdlets de Rutas
Split-Path n/a n/a Devuelve la parte especificada de una ruta. Cmdlets de Rutas
Resolve-Path rvpa n/a Resuelve los caracteres comodín de una ruta de acceso y muestra el contenido de la ruta. Cmdlets de Rutas
Test-Path n/a n/a Determina si existen todos los elementos de una ruta. Cmdlets de Rutas
Get-PSDrive gdr n/a Obtiene las unidades de Windows PowerShell incluidas en la sesión actual. Cmdlets PSDrive
New-PSDrive ndr mount Crea una unidad de Windows PowerShell en la sesión actual. Cmdlets PSDrive
Remove-PSDrive rdr n/a Quita una unidad de Windows PowerShell de su ubicación. Cmdlets PSDrive
Get-PSProvider n/a n/a Obtiene información sobre el proveedor de Windows PowerShell especificado. Cmdlets PSProvider
Tabla 1 - Todos los cmdlets disponibles para los proveedores de PowerShell.

 


Lista de Proveedores disponibles en PowerShell

Windows PowerShell incluye un conjunto de proveedores integrados que se puede usar para obtener acceso los distintos tipos de almacenes de datos. Ellos son:

 

Proveedor Unidad Almacén de datos
Alias Alias: Alias de Windows PowerShell
Certificate Cert: Certificados x509 para firmas digitales
Environment Env: Variables de entorno de Windows
FileSystem * Unidades, directorios y archivos del sistema de Archivos
Function Function: Funciones de Windows PowerShell
Registry HKLM:, HKCU: Registro de Windows
Variable Variable: Variables de Windows PowerShell
WS-Management WSMan Información de configuración de WS-Management
* Las unidades de FileSystem pueden variar según el sistema.


Asimismo, puede crear sus propios proveedores de PowerShell e instalar proveedores desarrollados por otros. Para mostrar los proveedores que están disponibles en la sesión, escriba:

 get-psprovider<enter>

Para información completa acerca de los proveedores de Power shell escriba el siguiente comando:

Get-Content $PSHOME\es-ES\about_providers.help.txt<enter>

PowerShell Drive “PSDrive”

Podemos conectarnos a los proveedores de PowerShell montando el dispositivo de Proveedores de PowerShell (PSDrive). La mayoría de los proveedores tienen sólo un PSDrive, las excepciones son: el proveedor "FileSystem" (depende del número de drivers en el sistema) y el proveedor "Registry" (HKLM y HKCU). Para conseguir la lista de Dispositivos PowerShell disponibles, escriba:

Get-PSDrive<enter>

La salida se muestra en la figura 1:

Figura 1- El cmdlet "Get-PSDrive", devuelve la lista de Dispositivos PowerShell disponibles.

 


Para que en la salida del cmdlet anterior, se desplieguen todas las columnas, se canaliza la salida al cmdlet "Format_Table", pasándole el parámetro "-AutoSize"

Exploremos cada uno de estos proveedores:

 

El Proveedor Alias de PowerShell

En el artículo Alias en PS vimos qué es un Alias. El proveedor Alias habilita el acceso a todos los alias en PowerShell. Para montar un dispositivo PSDrive usamos el cmdlet “Set-Location”. En este ejemplo, queremos montar el “Alias:” PSDrive. No olvide los dos puntos(:).

Set-Location Alias:<enter>

La salida de este cmdlet se ve en la figura 2:

Figura 2- Montando el PSDrive:Alias.


Como muestra la figura 2, estamos ahora conectados al PSDrive “Alias:”.

Los PSDrives sólo están disponibles en el entorno de PowerShell. No podrá conectarse al drive "Alias:” desde una ventana de comandos de windows "heredada".


Ahora que hemos montado el drive Alias:, podemos usar los mismos cmdlet como si estuviéramos trabajando con archivos y carpetas.

Ejemplo 1. Ver una lista de todos los alias.

Get-ChildItem<enter>

La salida de este cmdlet se ve en la figura 3:

Figura 3- Obteniendo la lista de todos los Alias.

 


Ejemplo 2. Listar las propiedades y métodos.

 

Get-ChildItem | Get-Member<enter>

 


Ejemplo 3. Use el parámetro "-Name" para listar todos los alias que comienzan con la letra “R”.

PowerShell soporta el uso de comodines (*) para filtrar los resultados.

 

Get-ChildItem -Name R*<enter>
Figura 4- Parámetro Name usado para filtrar todos los alias que comienzan con R.

 


Ejemplo 4. En lugar de usar un parámetro para filtrar los resultados, filtramos usando la propiedad “name” del objeto Alias.

 

 
Get-ChildItem | Where-Object {$_.name -like “R*”}

Figura 5- Filtrando con Where-Object.

El proveedor "Environment" de PowerShell

Seguramente ya conoce lo que es el proveedor Environment. Es equivalente a correr el comando “set” en una ventana de cmd de windows. Provee un listado de todas las variables de entorno definidas en el sistema. Gráficamente, puede ver las variables de entorno yendo a Properties -> Advanced Tab -> Click en el botón “Environment Variables”.

Ejemplo 1. Listar las variables de entorno

1.Listamos los PowerShell Providers disponibles:
Get-PSDrive<enter>
2.Mapeamos PSDrive con el Proveedor "Environment":
Set-Location env:<enter>
3.Listamos las variables de entorno:
Get-ChildItem<enter>

Ejemplo 2. Obtener el valor de una variable de entorno

1.Devolver el valor de la variable “OS”:
Get-ChildItem OS<enter>
2.Devolver todas las propiedades para la variable “OS”:
Get-ChildItem OS | Format-List *<enter>

Ejemplo 3. Crear una nueva variable de entorno

1.Creemos una nueva variable usando el cmdlet “New-Item". Llamemos a la nueva variable “MiVariable” y démosle el valor “Esta es mi nueva variable.” El argumento "Path" será un punto (.), significando la actual localización:
New-Item -Path . -Name MiVariable 
         -Value “Esta es mi nueva variable.”<enter>
Figura 6- Creando una nueva variable de entorno.
Para verificar que la variable ahora existe, usamos el cmdlet "Get-ChildItem".

Ejemplo 4. Renombrando la variable de entorno

1.Renombremos la variable “MiVariable” al nuevo valor “MiTotalVar”.
Rename-Item -Path env:MiVariable -NewName MiTotalVar<enter>
2.Ahora usemos el cmdlet “Get-ChildItem” para verificar el cambio:
Get-ChildItem<enter>

Ejemplo 5. Borrando una variable de entorno

1.Para borrar la variable “MiTotalVar” variable usamos el cmdlet “Remove-Item”.
Remove-Item MyRenVar;<enter>
2.Usamos “Get-ChildItem” para verificar que la variable ha sido borrada.
Get-ChildItem;<enter>

El Proveedor "File System" de PowerShell

Por defecto, el Proveedor "File System" es accesado cuando PowerShell es lanzado. Este proveedor, le permite crear, recuperar, y borrar archivos y carpetas. También, el proveedor "File System" le permite modificar archivos ya sea agregando o sobreeescribiendo datos.

Ejemplo 1. Listando Archivos y Directorios

1.Conectamos al proveedor "File System" y a la raíz del disco C:. Esto lo podemos hacer de dos maneras:
  • Cerramos y re-lanzamos PowerShell y escribimos
    cd \ 
  • Usamos el cmdlet “Set-Location”, y el caracter backslash (\) para conectarnos a la raíz del disco C:
    Set-Location C:\<enter>
    
2.Listamos archivos y directorios debajo de la raíz del disco C:.
Get-ChildItem<enter>
Figura 7- Lista de archivos y directorios de la carpeta raíz del disco C:.

3.Listamos archivos y directorios incluyendo sub-directorios.
Get-ChildItem -Recurse<enter>
Nota: Si su sistema de archivos es largo, el comando del paso 3 puede durar varios minutos. Use “Ctrl + C” para parar de procesar comandos en PowerShell, así como lo hacía en un cmd de DOS.

Viendo la figura 7, observamos que la primera columna de los resultados devueltos, es la columna "Mode"... pero ¿qué significa esta columna? Representa 5 bits de información que necesitamos conocer. A continuación una explicación de cada bit:
  • El primer bit puede ser una "d” (indicando que el elemento es un directorio) o “-” (indicando que el elemento es un archivo).
  • Los 4 últimos bits presentan las propiedades de un archivo y/o un directorio (a r h s). Significando: “a” = el bit de archivo es establecido. “r” = solo lectura. “h” = oculto. “s” = sistema. “-” en cualquier lugar significa que ese bit no está establecido.
Nota: Por defecto, el cmdlet “Get-ChildItem” o cualquier alias equivalente no muestra archivos o carpetas ocultas. Para mostrar los elementos ocultos debemos usar el parámetro “-force”.

Get-ChildItem -Force<enter>

Recuerde que los proveedores permiten el uso de los cmdlet que se establecen en la Tabla 1.

Ejemplo 2. Usando el cmdlet “Get-Location”

Para mostrar la actual localizacion usamos el cmdlet Get-Location, como sigue:
Get-Location<enter>
Podemos obtener el mismo resultado usando un alias y/o el comando equivalente:
gl<enter>
pwd<enter>

Ejemplo 3. Creando archivos y directorios

Para crear un nuevo directorio, usamos el cmdlet “New-Item”:
 
New-Item -Path C:\NewFolder -Type Directory<enter>
Una cosa interesante de PowerShell, es que él lo asistirá si usted se olvida de entrar alguna información que se requiere. Por ejemplo, digamso que al querer crear el directorio con el comando anterior, olvidó el parámetro -Type.
New-Item -Path C:\NewFolder<enter>
PowerShell le preguntará por el parámetro no entrado:
Type:
Continuando el cmdlet “New-Item”, creemos un archivo en nuestro nuevo directorio:
New-Item -Path C:\NewFolder\NewFile.txt -Type File<enter>

Ejemplo 4. Mover el archivo NewFile.txt al directorio raíz del disco “C:\” usando el cmd-let “Move-Item”.

Move-Item -Path C:\NewFolder\NewFile.txt C:\<enter>
Verifique que el archivo ha sido movido.
Get-ChildItem N*

Ejemplo 5. Renombrando archivos y directorios

Renombremos el archivo "NewFile.txt" a "ArchivoRenombrado.txt":
Rename-Item -Path C:\NewFile.txt ArchivoRenombrado.txt<enter>
Verifique que el archivo ha sido renombrado.
Get-ChildItem R*
Renombremos el directorio "NewFolder" to "CarpetaRenombrada".
Rename-Item -Path C:\NewFolder CarpetaRenombrada<enter>
Otra vez, verificamos el cambio:
Get-ChildItem R*

Ejemplo 6. Borrando archivos y directorios

Ahora, borremos la carpeta CarpetaRenombrada y el archivo ArchivoRenombrado.txt. Solo para verificarlo, agreguemos el parámetro "-confirm" así PowerShell nos pide confirmación de la acción:
Remove-Item -Path C:\ArchivoRenombrado.txt -Confirm<enter>
Presione “S” para confirmar el borrado del archivo y verifique que el archivo ha sido borrado:
Get-ChildItem R*
Todavía verá la carpeta RenFolder pero el archivo no está más presente. Ahora borramos el directorio.
Remove-Item -Path C:\RenFolder -Confirm<enter>
Nuevamente, presione “S” para confirmar y verificar que el directorio ha sido removido.
Get-ChildItem R*
Para leer un archivo y mostrar su contenido en la pantalla usamos: “Get-Content”. Para agregar datos a un archivo usamos: “Set-Content”. Para borrar los contenidos de un archivo, pero no borrar el archivo usamos: “Clear-Content”. Para agregar contenido a un archivo usamos:"Add-content”.

El Proveedor "Function" de PowerShell

PowerShell tiene un conjunto de funciones especificadas en el motor de PowerShell. El proveedor "Function" nos permite tener acceso a estas funciones, usando (como con todos los proovedores), los mismos cmdlets como si estuviéramos trabajando con archivos y carpetas. Una función le permite hacer llamados a un bloque de código. Cuando esté escibiendo scripts, si nota que está usando el mismo código varias veces (dentro del mismo script), puede considerar crear una función. Una función puede reducir la cantidad de código y mantener sus scripts más legibles y limpios. En caso que no esté familiarizado con lo que es uan función, los siguientes ejemplos le ayudarán a saberlo.
Note que en este artículo estaremos tratando funciones definidas en PowerShell, no cómo crear funciones en PowerShell. Más adelante publicaremos un artículo sobre scripting en PowerShell, y allí sí, estaremos viendo cómo crear sus propias funciones en PS.

Ejemplo 1. Listando Funciones

1. Use el cmdlet “Set-Location” y conéctese al PSDrive del proveedor "Function" de PowerShell:
 
Set-Location Function:<enter>
2. Usamos el cmdlet "Get-ChildItem" para obtener las funciones que están definidas en PS.
Get-ChildItem<enter>
La figura 8 muestra la información devuelta por este cmdlet. “Name” es el nombre dado a la función y “Definition” es el código que corre cuando llamamos al nombre.
Figura 8- Lista de las funciones disponibles en PowerShell.
Pero... que queremos decir con "llamar” a una función? En PowerShell, sólo necesitamos escribir el nombre de la función y el código se ejecutará. Por ejemplo, escribiendo “set-Location C:” navegamos a la raíz del drive C:. Podemso también navegar a la raíz de C:, sólo escribiendo (llamando) la función cuyo nombre es “C:”. PowerShell corre el código “Set-Location C:” que es quien nos ubica realmente en la raíz del drive C:. Veamos otro ejemplo:

Ejemplo 2. Viendo el código de una función de PowerShell.

1. Vamos a usar el cmdlet “Get-Content” para ver el código de la función "Clear-Host":
 
Get-Content Clear-Host<enter>
Este comando al ejecutarse, tiene la salida que vemos en la figura 9:
Figura 9- Viendo el código de la función "Clear-Host", con el cmdlet Get-Content .
Al observar el código de esta función nos damos cuenta por qué es mucho mas sencillo llamar a la función simplemente escribiendo su nombre, que escribir todo el código que realiza ese trabajo... Con esto comprobamos que las funciones reducen la cantidad de código que necesitamos escribir para realizar un trabajo (en este caso para borrar la pantalla).

El Proveedor "Registry" de PowerShell

Si usted siempre quiso trabajar con el registro con la misma facilidad que trabaja con el sistema de archivos, con PowerShell, ¡su deseo se ha cumplido! El proveedor "Registry" permite conectarnos a dos PSDrives:
  1. HKCU: HKEY_CURRENT_USER
  2. HKLM: HKEY_LOCAL_MACHINE
Con el proveedor de registro se puede: • Navegar en el registro. • Buscar en el registro. • Crear nuevas claves del registro. • Eliminar las claves del Registro. • Añadir nuevos valores. • Modificar los valores existentes. • Administrar las listas de control de acceso (ACL - Access Control Lists).

Ejemplo 1. Connectarse al PSDrive "HKLM" y Listar las claves del registro

. 1.Verifiquemos que los dos PSDrives que usan el proveedor Registry, a los que nos podemos conectar son "HKLM" y "HKCU". Para esto chequeamos los PSDrives que están disponibles, cuyos proveedores son Registry, con el siguiente cmdlet:
Get-PSDrive -PSProvider Registry<enter>
La salida de este cmdlet se ve en la figura 10:
Figura 10- Comprobando que tenemos dos PSDrives disponibles que usan el proveedor Registry .

2. Conectamos al PSProvider "HKLM", usando el cmdlet “Set-Location”.

Set-Location HKLM:<enter>

3. Podemos también conectarnos en cualquier lado de la ruta. Por ejemplo, conectémosnos a la clave "SOFTWARE":

Set-Location HKLM:\Software<enter>

4. Listamos las claves disponibles en la ubicación "Software".

Get-ChildItem<enter>
En la figura 11 vemos la salida de los 3 comandos anteriores:
Figura 11- Conectamos al PSProvider "HKLM", nos ubicamos en "Software" y obtenemos la lista de claves disponibles en esa ubicación .

Seguramente conoce los riesgos de hacer cambios en el registro. Por ese motivo, no veremos ejemplos que hagan cambios en el registro. Solo esté anuente que puede usar los mismos cmdlets usados cuando trabaja con todos los proveedores de PowerShell. Vea la tabla 1).

Cree y elimine una nueva clave de registro y su propiedad por defecto

1. Ubiquémosnos en "SOFTWARE":
Set-Location -Path HKLM:\SOFTWARE<enter>
2. Creemos una nueva llave de registro y una propiedad por defecto usando el cmdlet “New-Item”:
New-Item -Name Test -Value "Esta es una cadena de prueba"<enter>
3. Verifiquemos que la llave "Test" existe:
Get-ChildItem T*<enter>
4. Verifiquemos que la propiedad por defecto tiene el valor que entramos.
Get-ItemProperty -Path .\Test<enter>
5. Borremos la llave recién creada, usando el cmdlet “Remove-Item”:
Remove-Item Test<enter>
6. Verifiquemos que la llave ha sido eliminida:
Get-ChildItem T*<enter>

En la figura 12, vemos la ejecución de los 6 comandos anteriores:
Figura 12- Creación y borrado de una nueva clave de registro y su propiedad por defecto.

El Proveedor "Variable" de PowerShell

¿Qué es una variable? Es un lugar en la memoria, reservado para almacenar información. El proveedor "Variable" nos muestra que variables (tanto de PowerShell como definidas por el usuario) están disponibles. Estaremos trabajando con variables cuando trabajemos con scripting, así que aquí sólo veremos una introducción.

Ejemplo 1. Conectarse al PSDrive "Variable:" y listar las variables disponibles

Conectamos con el PSDrive, usando cd (alias para Set-Location):
cd Variable:<enter>
Listamos las variables disponibles, con el cmdlet "Get-ChildItem" (en el ejemplo uso su alias dir)
dir<enter>
En la figura 13, vemos las salidas de estos comandos:
Figura 13- Conexión al PSDrive variable: y enlistado de todas las variables diponibles.

Continuará pronto...
respag
Panamá - © 2012
Haga su donación para colaborar con La Escuela del Programador

La Escuela del Programador es un sitio web sin anuncios, sin ánimo de lucro, no es un sitio web comercial. Es el sueño de compartir con todos, muchos años de una gran pasión. Si realmente encuentra este sitio útil y lo aprovecha, le pido su generosa y no importa cuán modesta colaboración, simplemente para afrontar los costos de mantener este sitio disponible en internet.
No deseo lucrar con este sitio, ya que lo hago desinteresadamente, sólo le pido que, si puede, aporte (desde un dólar hasta lo que crea que puede dar), para afrontar los costos de dominio y hosting. Muchísimas gracias y ojalá juntos podamos hacer un sitio que sea una buena fuente de aprendizaje de programacíon en español.

Si no se siente en condiciones de colaborar, igualmente será bienvenido al sitio, es libre para todos y será un placer que encuentre mis artículos provechosos, pero si realmente me ayuda con una donación minima, seguramente, colaborará para que La Escuela del Programador se mantenga en la Web y crezca, conviertiendo a este sitio hecho con mucha pasión, dedicación y esfuerzo, en una buena fuente de aprendizaje.

Mis saludos cordiales y gracias por interesarse en mi sitio.

Rubén E. Spagnuolo
respag
Panamá - © 2012