Detener todas las demás sesiones de Windows PowerShell
En algunas ocasiones, puede resultar útil poder detener todas las sesiones de Windows PowerShell que se estén ejecutando, menos la sesión actual. Si una sesión está utilizando demasiados recursos o no es posible tener acceso a ella (puede estar ejecutándose de forma remota o en otra sesión del escritorio), es posible que no pueda detenerla directamente. No obstante, si intenta detener todas las sesiones que se están ejecutando, es posible que lo que termine sea la sesión actual.
Cada sesión de Windows PowerShell tiene un PID de variable de entorno que contiene el Id. del proceso de Windows PowerShell. Puede comparar el $PID con el Id. de cada sesión y terminar únicamente las sesiones de Windows PowerShell que tengan un Id. distinto. El siguiente comando de canalización realiza esta tarea y devuelve una lista de las sesiones terminadas (debido a que se usa el parámetro PassThru):
PS> Get-Process -Name powershell | Where-Object -FilterScript {$_.Id -ne $PID} | Stop-Process -
PassThru
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
334 9 23348 29136 143 1.03 388 powershell
304 9 23152 29040 143 1.03 632 powershell
302 9 20916 26804 143 1.03 1116 powershell
335 9 25656 31412 143 1.09 3452 powershell
303 9 23156 29044 143 1.05 3608 powershell
287 9 21044 26928 143 1.02 3672 powershell
Administrar servicios locales
Hay ocho cmdlets Service principales, diseñados para una amplia variedad de tareas relacionadas con servicios. Explicaremos únicamente cómo se enumeran y cambian los estados de ejecución de servicios, pero puede obtener una lista de los cmdlets Service con Get-Help *-Service y también puede obtener información acerca de cada cmdlet Service con Get-Help<nombreCmdlet> (p. ej., Get-Help New-Service).
Mostrar la lista de servicios
Puede mostrar los servicios locales de un equipo con Get-Service. Al igual que con Get-Process, el uso del comando Get-Service sin parámetros devuelve todos los servicios. Puede filtrarlos por nombre e incluso utilizar un asterisco como carácter comodín:
PS> Get-Service -Name se*
Status Name DisplayName
------ ---- -----------
Running seclogon Secondary Logon
Running SENS System Event Notification
Stopped ServiceLayer ServiceLayer
Dado que no siempre es evidente cuál es el nombre real del servicio, puede encontrarse con que necesita buscar los servicios por el nombre para mostrar. Puede hacerlo por un nombre específico, con caracteres comodín o utilizando una lista de nombres para mostrar:
PS> Get-Service -DisplayName se*
Status Name DisplayName
------ ---- -----------
Running lanmanserver Server
Running SamSs Security Accounts Manager
Running seclogon Secondary Logon
Stopped ServiceLayer ServiceLayer
Running wscsvc Security Center
PS> Get-Service -DisplayName ServiceLayer,Server
Status Name DisplayName
------ ---- -----------
Running lanmanserver Server
Stopped ServiceLayer ServiceLayer
Detener, iniciar, suspender y reiniciar servicios
Los cmdlets Service tienen todos el mismo formato general. Puede especificar los servicios por el nombre común o el nombre para mostrar, así como usar listas y caracteres comodín como valores. Para detener la cola de impresión, utilice:
Stop-Service -Name spooler
Para iniciar la cola de impresión después de haberla detenido, utilice:
Start-Service -Name spooler
Para suspender la cola de impresión, utilice:
Suspend-Service -Name spooler
El cmdlet Restart-Service funciona de la misma manera que los otros cmdlets Service, pero mostraremos algunos ejemplos más complejos de este cmdlet. Con el uso más sencillo, puede especificar el nombre del servicio:
PS> Restart-Service -Name spooler
ADVERTENCIA: Esperando a que termine de iniciarse el servicio 'Print Spooler (Spooler)'...
ADVERTENCIA: Esperando a que termine de iniciarse el servicio 'Print Spooler (Spooler)'...
PS>
Observará que aparece varias veces un mensaje de advertencia relativo al inicio de la cola de impresión. Si realiza una operación de servicio que tarda cierto tiempo en completarse, Windows PowerShell le informará de que todavía está intentando realizar la tarea.
Si desea reiniciar varios servicios, puede obtener una lista de los servicios, filtrarlos y, a continuación, efectuar el reinicio:
PS> Get-Service | Where-Object -FilterScript {$_.CanStop} | Restart-Service
ADVERTENCIA: Esperando a que termine de detenerse el servicio 'Computer Browser (Browser)'...
ADVERTENCIA: Esperando a que termine de detenerse el servicio 'Computer Browser (Browser)'...
Restart-Service : No se puede detener el servicio 'Logical Disk Manager (dmserver)' porque
tiene servicios dependientes. Sólo se puede detener si está establecida la marca Force.
En línea:1 carácter:57
+ Get-Service | Where-Object -FilterScript {$_.CanStop} | Restart-Service <<<<
ADVERTENCIA: Esperando a que termine de iniciarse el servicio 'Print Spooler (Spooler)'...
ADVERTENCIA: Esperando a que termine de iniciarse el servicio 'Print Spooler (Spooler)'...
Recopilar información acerca de equipos
Get-WmiObject es el cmdlet más importante para tareas generales de administración de sistemas. Toda la configuración fundamental de los subsistemas se expone mediante WMI. Además, WMI trata los datos como objetos incluidos en conjuntos de uno o más elementos. Dado que Windows PowerShell también trabaja con objetos y cuenta con una canalización que permite tratar uno o varios objetos de la misma manera, el acceso general a WMI permite realizar algunas tareas avanzadas con muy poco esfuerzo.
En los siguientes ejemplos se muestra cómo recopilar información específica con
Get-WmiObject respecto a un equipo arbitrario. El valor especificado del parámetro ComputerName es un punto (.), que representa al equipo local. Puede especificar un nombre o una dirección IP correspondiente a cualquier equipo al que pueda tener acceso mediante WMI. Para recuperar información acerca del equipo local, puede omitir -ComputerName.
Mostrar la lista de configuraciones de escritorio
Empezamos con un comando que recopila información acerca de los escritorios del equipo local.
Get-WmiObject -Class Win32_Desktop -ComputerName .
Este comando devuelve información de todos los escritorios, estén o no en uso.
Nota:
La información que devuelven algunas clases de WMI puede ser muy detallada e incluye a menudo metadatos acerca de dicha clase. Dado que la mayoría de estas propiedades de metadatos tienen nombres que comienzan por dos caracteres de subrayado, puede filtrar las propiedades con Select-Object. Puede especificar únicamente las propiedades que comiencen por caracteres alfabéticos si utiliza [a-z]* como el valor de Property. Por ejemplo:
Get-WmiObject -Class Win32_Desktop -ComputerName . | Select-Object -Property [a-z]*
Para filtrar los metadatos, utilice un operador de canalización (|) para enviar los resultados del comando Get-WmiObject a Select-Object -Property [a-z]*.
Mostrar información del BIOS
La clase Win32_BIOS de WMI devuelve información bastante compacta y completa acerca del BIOS del sistema en el equipo local:
Get-WmiObject -Class Win32_BIOS -ComputerName .
Mostrar información de procesadores
Puede recuperar información general de procesadores con la clase Win32_Processor de WMI, aunque es probable que desee filtrar la información:
Get-WmiObject -Class Win32_Processor -ComputerName . | Select-Object -Property [a-z]*
Para obtener una cadena de descripción general de la familia de procesadores, basta con que se devuelva la propiedad Win32_ComputerSystemSystemType:
PS> Get-WmiObject -Class Win32_ComputerSystem -ComputerName . | Select-Object -Property SystemType
SystemType
----------
X86-based PC
Mostrar el fabricante y el modelo del equipo
La información del modelo del equipo también está disponible en Win32_ComputerSystem. No es necesario filtrar el resultado estándar mostrado para proporcionar los datos de OEM:
PS> Get-WmiObject -Class Win32_ComputerSystem
Domain : WORKGROUP
Manufacturer : Compaq Presario 06
Model : DA243A-ABA 6415cl NA910
Name : MyPC
PrimaryOwnerName : Jane Doe
TotalPhysicalMemory : 804765696
El resultado de comandos como éste, que devuelven información directamente de algunos componentes de hardware, será tan válido como los datos de los que usted disponga. Algunos fabricantes de hardware pueden no haber configurado correctamente algún tipo de información y, por tanto, es posible que esta información no esté disponible.
Mostrar las revisiones instaladas
Puede mostrar todas las revisiones instaladas con Win32_QuickFixEngineering:
Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName .
Esta clase devuelve una lista de revisiones similar a la siguiente:
Description : Update for Windows XP (KB910437)
FixComments : Update
HotFixID : KB910437
Install Date :
InstalledBy : Administrator
InstalledOn : 12/16/2005
Name :
ServicePackInEffect : SP3
Status :
Para que el resultado sea más conciso, quizá desee excluir algunas propiedades. Aunque puede utilizar el parámetro Get-WmiObject Property para seleccionar sólo el HotFixID, en realidad esta acción devuelve más información, ya que todos los metadatos se muestran de manera predeterminada:
PS> Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName . -Property HotFixId
HotFixID : KB910437
__GENUS : 2
__CLASS : Win32_QuickFixEngineering
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
Se devuelven los datos adicionales porque el parámetro Property de Get-WmiObject limita las propiedades devueltas de instancias de clases de WMI, no el objeto devuelto a Windows PowerShell. Para reducir el resultado, utilice Select-Object:
PS> Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName . -Property Hot
FixId | Select-Object -Property HotFixId
HotFixId
--------
KB910437
Mostrar información de versión del sistema operativo
Las propiedades de la clase Win32_OperatingSystem incluyen información sobre la versión del sistema operativo y los Service Pack instalados. Puede seleccionar explícitamente estas propiedades únicamente para obtener un resumen de la información de versión de Win32_OperatingSystem:
Get-WmiObject -Class Win32_OperatingSystem -ComputerName . | Select-Object -Property BuildNumber,BuildType,OSType,ServicePackMajorVersion,ServicePackMinorVersion
También puede utilizar caracteres comodín con el parámetro Select-Object Property. Como todas las propiedades que comienzan por Build o ServicePack son importantes en este caso, hemos reducido el resultado de la siguiente manera:
PS> Get-WmiObject -Class Win32_OperatingSystem -ComputerName . | Select-Object -Property Build*,OSType,ServicePack*
BuildNumber : 2600
BuildType : Uniprocessor Free
OSType : 18
ServicePackMajorVersion : 2
ServicePackMinorVersion : 0
Mostrar los usuarios y propietarios locales
La información general sobre los usuarios locales (número de usuarios con licencia, número actual de usuarios y nombre del propietario) está disponible mediante una selección de propiedades de Win32_OperatingSystem. Puede seleccionar explícitamente las propiedades para que se muestre lo siguiente:
Get-WmiObject -Class Win32_OperatingSystem -ComputerName . | Select-Object -Property NumberOfLicensedUsers,NumberOfUsers,RegisteredUser
Una versión más concisa con caracteres comodín es la siguiente:
Get-WmiObject -Class Win32_OperatingSystem -ComputerName . | Select-Object -Property *user*
Obtener el espacio en disco disponible
Para ver el espacio en disco y el espacio disponible para unidades locales, puede utilizar la clase Win32_LogicalDisk de WMI. Necesita ver únicamente las instancias con el valor 3 para DriveType, que es el valor que WMI usa para los discos duros fijos.
Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType=3" -ComputerName .
DeviceID : C:
DriveType : 3
ProviderName :
FreeSpace : 65541357568
Size : 203912880128
VolumeName : Local Disk
DeviceID : Q:
DriveType : 3
ProviderName :
FreeSpace : 44298250240
Size : 122934034432
VolumeName : New Volume
PS> Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType=3" -ComputerName . | Measure-Object -Property FreeSpace,Size -Sum
Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType=3" -ComputerName . | Measure-Object -Property FreeSpace,Size -Sum | Select-Object -Property Property,Sum
Obtener información de sesiones iniciadas
Puede obtener información general acerca de sesiones iniciadas que estén asociadas a usuarios mediante la clase Win32_LogonSession de WMI:
Get-WmiObject -Class Win32_LogonSession -ComputerName .
Obtener el usuario que ha iniciado una sesión en un equipo
Puede mostrar el usuario que ha iniciado una sesión en un determinado equipo con Win32_ComputerSystem. Este comando devuelve únicamente el usuario que ha iniciado una sesión en el escritorio del sistema:
Get-WmiObject -Class Win32_ComputerSystem -Property UserName -ComputerName .
Obtener la hora local de un equipo
Puede recuperar la hora local actual que se muestra en un equipo específico con la clase Win32_LocalTime de WMI. Como esta clase muestra todos los metadatos de manera predeterminada, es posible que desee filtrarlos con Select-Object:
PS> Get-WmiObject -Class Win32_LocalTime -ComputerName . | Select-Object -Property [a-z]*
Day : 15
DayOfWeek : 4
Hour : 12
Milliseconds :
Minute : 11
Month : 6
Quarter : 2
Second : 52
WeekInMonth : 3
Year : 2006
Mostrar el estado de un servicio
Para ver el estado de todos los servicios en un equipo específico, puede utilizar localmente el cmdlet Get-Service como se ha mencionado anteriormente. Para sistemas remotos, puede usar la clase Win32_Service de WMI. Si usa también Select-Object para filtrar los resultados a Status, Name y DisplayName, el formato de los resultados será prácticamente igual que el de Get-Service:
Get-WmiObject -Class Win32_Service -ComputerName . | Select-Object -Property Status,Name,DisplayName
Para que se muestren completos los nombres de servicio que sean muy largos, quizá desee usar Format-Table con los parámetros AutoSize y Wrap, lo que optimiza el ancho de columna y permite ajustar los nombres largos en lugar de truncarlos:
Get-WmiObject -Class Win32_Service -ComputerName . | Format-Table -Property Status,Name,DisplayName -AutoSize -Wrap
Trabajar con instalaciones de software
Se puede tener acceso a aplicaciones diseñadas correctamente para utilizar Windows Installer mediante la clase Win32_Product de WMI, pero actualmente no todas las aplicaciones usan Windows Installer. Dado que Windows Installer proporciona la mayor variedad de técnicas estándar para trabajar con aplicaciones que se pueden instalar, nos centraremos principalmente en este tipo de aplicaciones. Las aplicaciones que utilizan otras rutinas de instalación no se suelen administrar con Windows Installer. Las técnicas concretas para trabajar con estas aplicaciones dependen del software de instalación y de las decisiones que adopte el programador de la aplicación.
Nota:
Las aplicaciones que se instalan con el procedimiento de copiar los archivos de la aplicación en el equipo no se pueden administrar normalmente con las técnicas descritas aquí. Estas aplicaciones se pueden administrar como si fueran archivos y carpetas utilizando las técnicas descritas en la sección "Trabajar con archivos y carpetas".
Mostrar las aplicaciones instaladas con Windows Installer
Las aplicaciones instaladas con Windows Installer en un sistema local o remoto se pueden enumerar fácilmente mediante una simple consulta de WMI:
PS> Get-WmiObject -Class Win32_Product -ComputerName .
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
Name : Microsoft .NET Framework 2.0
Vendor : Microsoft Corporation
Version : 2.0.50727
Caption : Microsoft .NET Framework 2.0
Quizá desee usar Select-Object, ya que puede resultar útil otro tipo de información que no se muestra de manera predeterminada. Si desea buscar la ubicación de la caché de paquetes de Microsoft .NET Framework 2.0, puede utilizar lo siguiente:
PS> Get-WmiObject -Class Win32_Product -ComputerName . | Where-Object -FilterScript {$_.Name -eq "Microsoft .NET Framework 2.0"} | Select-Object -Property [a-z]*
Name : Microsoft .NET Framework 2.0
Version : 2.0.50727
InstallState : 5
Caption : Microsoft .NET Framework 2.0
Description : Microsoft .NET Framework 2.0
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
InstallDate : 20060506
InstallDate2 : 20060506000000.000000-000
InstallLocation :
PackageCache : C:\WINDOWS\Installer\619ab2.msi
SKUNumber :
Vendor : Microsoft Corporation
Como alternativa, puede usar el parámetro Get-WmiObject Filter para seleccionar sólo Microsoft .NET Framework 2.0. Este comando aplica un filtro de WMI, por lo que no se usa la sintaxis de filtrado de Windows PowerShell. En su lugar, se usa el lenguaje de consultas de WMI (WQL):
Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='Microsoft .NET Framework 2.0'"| Select-Object -Property [a-z]*
Nota:
Las consultas de WQL suelen contener caracteres, como espacios o el signo igual, que tienen un significado especial en Windows PowerShell. Por este motivo, es aconsejable especificar siempre el valor del parámetro Filter entre comillas. También se puede usar el carácter de escape de Windows PowerShell, un acento grave (`), aunque no mejore la legibilidad. El siguiente comando equivale al comando anterior y devuelve los mismos resultados, pero utiliza el acento grave para omitir caracteres especiales, en lugar de especificar entre comillas la cadena de filtro completa:
Get-WmiObject -Class Win32_Product -ComputerName . -Filter Name`=`'Microsoft` .NET` Framework` 2.0`' | Select-Object -Property [a-z]*
Otra manera de generar una lista reducida es seleccionar explícitamente el formato de presentación. El siguiente resultado contiene algunas de las propiedades más útiles para identificar determinados paquetes instalados:
Get-WmiObject -Class Win32_Product -ComputerName . | Format-List Name,InstallDate,InstallLocation,PackageCache,Vendor,Version,IdentifyingNumber
...
Name : HighMAT Extension to Microsoft Windows XP CD Writing Wizard
InstallDate : 20051022
InstallLocation : C:\Archivos de programa\HighMAT CD Writing Wizard\
PackageCache : C:\WINDOWS\Installer\113b54.msi
Vendor : Microsoft Corporation
Version : 1.1.1905.1
IdentifyingNumber : {FCE65C4E-B0E8-4FBD-AD16-EDCBE6CD591F}
...
Por último, para buscar únicamente los nombres de las aplicaciones instaladas, una sencilla instrucción Format-Wide reducirá el resultado:
Get-WmiObject -Class Win32_Product -ComputerName . | Format-Wide -Column 1
Aunque ahora disponemos de varias maneras de examinar las aplicaciones instaladas con Windows Installer, no hemos considerado otras aplicaciones. Puesto que la mayoría de las aplicaciones estándar registran su programa de desinstalación en Windows, podemos trabajar con estos programas localmente buscándolos en el Registro de Windows.
Mostrar todas las aplicaciones que se pueden desinstalar
Aunque no hay manera de garantizar que se pueda encontrar cada aplicación del sistema, se pueden buscar todos los programas que aparecen en el cuadro de diálogo Agregar o quitar programas. Agregar o quitar programas busca estas aplicaciones en las listas que mantiene en la clave del Registro HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall, pero también podemos examinar manualmente esta clave para buscar aplicaciones. Para poder ver más fácilmente la clave Uninstall, podemos asignar una unidad de Windows PowerShell a esta ubicación del Registro:
PS> New-PSDrive -Name Uninstall -PSProvider Registry -Root HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
Name Provider Root CurrentLocation
---- -------- ---- ---------------
Uninstall Registry HKEY_LOCAL_MACHINE\SOFTWARE\Micr...
Nota:
La unidad HKLM: está asignada a la raíz de HKEY_LOCAL_MACHINE, motivo por el que hemos utilizado esta unidad en la ruta de acceso a la clave Uninstall. En lugar de HKLM:, podríamos haber especificado la ruta de acceso al Registro con HKLM o HKEY_LOCAL_MACHINE. La ventaja de usar una unidad del Registro existente es que podemos utilizar el procedimiento para completar con el tabulador para completar los nombres de las claves, de manera que no es necesario escribirlas.
Ahora tenemos una unidad llamada "Uninstall" que podemos usar para buscar aplicaciones instaladas con comodidad y rapidez. Para saber el número de aplicaciones instaladas, puede contar el número de claves del Registro que aparecen en la unidad Uninstall: de Windows PowerShell:
PS> (Get-ChildItem -Path Uninstall:).Length
459
Podemos realizar búsquedas más refinadas en esta lista de aplicaciones mediante diversas técnicas, empezando por Get-ChildItem. Para obtener una lista de las aplicaciones en la variable $UninstallableApplications, podemos realizar lo siguiente:
$UninstallableApplications = Get-ChildItem -Path Uninstall:
Nota:
Usamos un nombre de variable largo por mayor claridad. En la realidad, no hay ningún motivo para usar nombres largos. Aunque puede usar el procedimiento para completar con el tabulador para los nombres de variables, también puede usar nombres de 1 ó 2 caracteres para ir más rápido. Los nombres descriptivos largos son muy útiles cuando se programa código que se va a volver a utilizar más adelante.
Podemos buscar los nombres para mostrar de las aplicaciones en la clave Uninstall con el siguiente comando:
PS> Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("DisplayName") }
No hay ninguna garantía de que estos valores sean únicos. En el siguiente ejemplo, dos elementos instalados aparecen como "Windows Media Encoder 9 Series":
PS> Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -eq "Windows Media Encoder 9 Series"}
Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Windows\CurrentVersion\Uninstall
SKC VC Name Property
--- -- ---- --------
0 3 Windows Media Encoder 9 {DisplayName, DisplayIcon, UninstallS...
0 24 {E38C00D0-A68B-4318-A8A6-F7... {AuthorizedCDFPrefix, Comments, Conta...
Instalar aplicaciones
La clase Win32_Product permite instalar paquetes de Windows Installer, ya sea de forma remota o local. En lo que respecta a las instalaciones remotas, se debe especificar la ruta de acceso al paquete .msi para la instalación como una ruta de red UNC (Convención de nomenclatura universal) típica, ya que el subsistema WMI no reconoce las rutas de Windows PowerShell. Por ejemplo, para instalar el paquete de MSI NewPackage.msi ubicado en el recurso compartido de red \\AppServ\dsp, en el equipo remoto PC01, deberá escribir lo siguiente en el símbolo del sistema de Windows PowerShell:
(Get-WMIObject -ComputerName PC01 -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).InvokeMethod("Install","\\AppSrv\dsp\NewPackage.msi")
Las aplicaciones que no utilizan la tecnología Windows Installer pueden disponer de métodos específicos para la implementación automatizada. Para averiguar si hay un método para la implementación automatizada, probablemente necesite consultar la documentación de la aplicación o ponerse en contacto con el servicio de soporte técnico del proveedor de la aplicación. En algunos casos, aunque el proveedor no haya diseñado específicamente la aplicación para la instalación automatizada, es posible que el fabricante del software de instalación disponga de técnicas para la automatización.
Eliminar aplicaciones
El procedimiento para quitar un paquete de Windows Installer con Windows PowerShell es prácticamente el mismo que se utiliza para instalar un paquete con InvokeMethod. En el siguiente ejemplo, se selecciona el paquete que se va a desinstalar según su propiedad Name; en algunos casos, puede resultar más fácil filtrar con IdentifyingNumber:
(Get-WmiObject -Class Win32_Product -Filter "Name='ILMerge'" -ComputerName . ).InvokeMethod("Uninstall",$null)
Quitar otras aplicaciones no es sencillo, ni siquiera localmente. Podemos encontrar las cadenas de desinstalación de la línea de comandos correspondientes a estas aplicaciones mediante la extracción de la propiedad UninstallString. Este método se puede usar para aplicaciones instaladas con Windows Installer y para programas antiguos mostrados en la clave Uninstall:
Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("UninstallString") }
Si lo desea, puede filtrar el resultado por el nombre para mostrar:
Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -like "Win*"} | ForEach-Object -Process { $_.GetValue("UninstallString") }
No obstante, es posible que estas cadenas no se puedan utilizar directamente desde el símbolo del sistema de Windows PowerShell sin alguna modificación.
Actualizar aplicaciones instaladas con Windows Installer
Para actualizar una aplicación se utilizan dos tipos de información: necesita saber el nombre de la aplicación instalada que se va a actualizar, así como la ruta de acceso al paquete de actualización de la aplicación. Con esta información, se puede realizar una actualización desde Windows PowerShell con una única línea de comandos:
(Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='OldAppName'").InvokeMethod("Upgrade","\\AppSrv\dsp\OldAppUpgrade.msi")
Cambiar el estado del equipo: bloquear, cerrar la sesión, apagar y reiniciar
Puede restablecer un equipo de varias maneras distintas desde Windows PowerShell pero en la primera versión debe usar una herramienta estándar de línea de comandos o WMI. Aunque está utilizando Windows PowerShell sólo para invocar una determinada herramienta, recorrer el proceso para cambiar el estado de energía de un equipo ilustra algunas partes importantes del uso de herramientas externas.
Bloquear un equipo
La única manera de bloquear directamente un equipo con las herramientas estándar disponibles es llamar directamente a la función LockWorkstation() en user32.dll:
rundll32.exe user32.dll,LockWorkStation
Este comando bloquea de forma inmediata la estación de trabajo. En sistemas operativos como Windows XP, con Cambio rápido de usuario activado, el equipo volverá a la pantalla de inicio de sesión del usuario en lugar de iniciar el protector de pantalla del usuario actual. En un servidor Terminal Server, donde quizá desee desconectar sesiones específicas, también puede utilizar la herramienta tsshutdn.exe de la línea de comandos.
Cerrar la sesión actual
Puede cerrar una sesión de varias maneras distintas en el sistema local. La manera más sencilla es usar la herramienta de línea de comandos logoff.exe de Escritorio remoto/Servicios de Terminal Server (escriba logoff /? en el símbolo del sistema de Windows PowerShell o del shell de comandos para ver la información de uso). Para cerrar la sesión activa actualmente, escriba logoff sin argumentos.
Otra opción es utilizar la herramienta shutdown.exe con la opción de cierre de sesión correspondiente:
shutdown.exe -l
Una tercera opción es usar WMI. La clase Win32_OperatingSystem incluye el método Win32Shutdown; si se invoca este método con el argumento 0, se iniciará el cierre de la sesión:
(Get-WmiObject -Class Win32_OperatingSystem -ComputerName .).InvokeMethod("Win32Shutdown",0)
Apagar o reiniciar un equipo
Apagar y reiniciar equipos son generalmente tareas del mismo tipo. Las herramientas utilizadas para apagar equipos suelen reiniciarlos también, y viceversa. Hay dos opciones sencillas para reiniciar un equipo desde Windows PowerShell: tsshutdn.exe o shutdown.exe, con los argumentos adecuados. Puede obtener información de uso detallada con tsshutdn.exe /? o shutdown.exe /?.
Asimismo, es posible apagar y reiniciar un equipo utilizando Win32_OperatingSystem directamente desde Windows PowerShell. No obstante, la información detallada de este tipo de implementación queda fuera del ámbito de esta Guía básica de Windows PowerShell.
Trabajar con impresoras
Las tareas de administración de impresoras pueden realizarse en Windows PowerShell con WMI y con el objeto COM WScript.Network de WSH. Utilizaremos una combinación de ambas herramientas para demostrar la forma de realizar tareas específicas.
Crear una lista de conexiones de impresora
La manera más sencilla de crear una lista de las impresoras instaladas en un equipo es usar la clase Win32_Printer de WMI:
Get-WmiObject -Class Win32_Printer -ComputerName .
También puede crear una lista de las impresoras con el objeto COM WScript.Network utilizado habitualmente en scripts de WSH:
(New-Object -ComObject WScript.Network).EnumPrinterConnections()
Este comando devuelve un simple conjunto de cadenas de los nombres de puertos y los nombres de dispositivos de impresora sin etiquetas distintivas, lo que no resulta útil para facilitar la inspección.
Agregar una impresora de red
La manera más fácil de agregar una impresora de red es utilizar WScript.Network:
(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection("\\Printserver01\Xerox5")
Configurar una impresora predeterminada
Para establecer la impresora predeterminada con WMI, debe filtrar la colección Win32_Printer hasta obtener la impresora deseada y, a continuación, invocar el método SetDefaultPrinter:
(Get-WmiObject -ComputerName . -Class Win32_Printer -Filter "Name='HP LaserJet 5Si'").InvokeMethod("SetDefaultPrinter",$null)
WScript.Network es un poco más fácil de utilizar; incluye también el método SetDefaultPrinter y sólo es necesario especificar el nombre de la impresora como argumento:
(New-Object -ComObject WScript.Network).SetDefaultPrinter('HP LaserJet 5Si')
Quitar una conexión de impresora
Puede quitar una conexión de impresora con el método WScript.Network RemovePrinterConnection:
(New-Object -ComObject WScript.Network).RemovePrinterConnection("\\Printserver01\Xerox5")
Realizar tareas de red
La mayoría de las tareas básicas de administración de protocolos de red implican el uso de TCP/IP, ya que éste es el protocolo de red más utilizado. Veremos ahora cómo efectuar una selección de estas tareas desde Windows PowerShell con WMI.
Crear una lista de direcciones IP utilizadas en un equipo
Puede devolver todas las direcciones IP que se estén utilizando en un equipo con el siguiente comando:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | Select-Object -Property IPAddress
El resultado de este comando es diferente de la mayoría de las listas de propiedades, ya que los valores se especifican entre llaves:
IPAddress
---------
{192.168.1.80}
{192.168.148.1}
{192.168.171.1}
{0.0.0.0}
Para entender por qué se especifican entre llaves, examine detenidamente la propiedad IPAddress con Get-Member:
PS> Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | Get-Member -Name IPAddress
TypeName: System.Management.ManagementObject#root\cimv2\Win32_NetworkAdapter
Configuration
Name MemberType Definition
---- ---------- ----------
IPAddress Property System.String[] IPAddress {get;}
La propiedad IPAddress de cada adaptador de red es en realidad una matriz. Las llaves de la definición indican que IPAddress no es un valor de System.String, sino una matriz de valores de System.String.
Puede expandir estos valores con el parámetro Select-Object ExpandProperty:
PS> Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | Select-Object -ExpandProperty IPAddress
192.168.1.80
192.168.148.1
192.168.171.1
0.0.0.0
Mostrar los datos de configuración de IP
Para mostrar los datos de configuración de IP correspondientes a cada adaptador de red, puede utilizar el siguiente comando:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .
Nota:
De manera predeterminada, se muestra un conjunto muy reducido de la información de configuración disponible de los adaptadores de red. Para una inspección más exhaustiva y para la solución de problemas, Select-Object permite forzar la presentación de más propiedades. Si no está interesado en las propiedades de IPX o WINS (lo que probablemente sea el caso en una red TCP/IP moderna), también puede excluir todas las propiedades que comiencen por WINS o IPX:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | Select-Object -Property [a-z]* -ExcludeProperty IPX*,WINS*
Este comando devolverá información detallada acerca de DHCP, DNS, el enrutamiento y otras propiedades de configuración de IP menos importantes.
Hacer ping en equipos
Puede hacer un sencillo ping a un equipo con Win32_PingStatus. El siguiente comando hará el ping, pero devuelve un resultado largo:
Get-WmiObject -Class Win32_PingStatus -Filter "Address='127.0.0.1'" -ComputerName .
Un formato más útil para la información de resumen es mostrar sólo las propiedades Address, ResponseTime y StatusCode:
PS> Get-WmiObject -Class Win32_PingStatus -Filter "Address='127.0.0.1'" -ComputerName . | Select-Object -Property Address,ResponseTime,StatusCode
Address ResponseTime StatusCode
------- ------------ ----------
127.0.0.1 0 0
El código de estado 0 indica que el ping ha sido correcto.
Puede hacer ping a toda una serie de equipos utilizando una matriz. Como se utilizan varias direcciones, hay que usar ForEach-Object para hacer ping a cada dirección por separado:
"127.0.0.1","localhost","research.microsoft.com" | ForEach-Object -Process {Get-WmiObject -Class Win32_PingStatus -Filter ("Address='" + $_ + "'") -ComputerName .} | Select-Object -Property Address,ResponseTime,StatusCode
Se puede utilizar el mismo proceso para hacer ping a toda una subred. Por ejemplo, si desea comprobar una red privada con el número de red 192.168.1.0 y usa una máscara de subred estándar de clase C (255.255.255.0), únicamente las direcciones entre 192.168.1.1 y 192.168.1.254 serán direcciones locales válidas (0 se reserva siempre para el número de red y 255 es una dirección de emisión de subred).
Puede obtener una matriz de los números del 1 al 254 en Windows PowerShell con la instrucción 1..254; por tanto, se puede hacer un ping de subred completo si se genera la matriz y se agregan los valores a una dirección parcial en la instrucción ping:
1..254| ForEach-Object -Process {Get-WmiObject -Class Win32_PingStatus -Filter ("Address='192.168.1." + $_ + "'") -ComputerName .} | Select-Object -Property Address,ResponseTime,StatusCode
Nota:
Esta técnica para generar un intervalo de direcciones se puede usar también en otras partes. Puede generar un conjunto completo de direcciones de esta manera:
$ips = 1..254 | ForEach-Object -Process {"192.168.1." + $_}
Recuperar propiedades de adaptadores de red
En una sección anterior de esta Guía básica, hemos mencionado que podía recuperar propiedades de configuración generales con Win32_NetworkAdapterConfiguration. Aunque no se trata estrictamente de información de TCP/IP, la información relativa a los adaptadores de red, como las direcciones MAC y los tipos de adaptadores, puede resultar útil para entender lo que está pasando en un equipo. Puede obtener un resumen de esta información con este comando:
Get-WmiObject -Class Win32_NetworkAdapter -ComputerName .
Asignar el dominio DNS para un adaptador de red
La asignación del dominio DNS para utilizarlo en la resolución automática de nombres se puede automatizar con el método Win32_NetworkAdapterConfiguration SetDNSDomain. Dado que se asigna el dominio DNS por separado para la configuración de cada adaptador de red, es necesario usar una instrucción ForEach-Object para asegurarse de que se seleccionan los adaptadores de forma individual:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=true -ComputerName . | ForEach-Object -Process { $_.InvokeMethod("SetDNSDomain", "fabrikam.com")}
Hemos utilizado aquí la instrucción de filtrado IPEnabled=true porque, incluso en una red que usa sólo TCP/IP, varias de las configuraciones de adaptadores de red que hay en un equipo no son adaptadores TCP/IP reales; se trata de elementos de software generales que admiten RAS, PPTP, QoS y otros servicios para todos los adaptadores y, por tanto, no tienen una dirección propia.
Podría filtrar el comando con Where-Object, en lugar de usar Get-WmiObject Filter:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName . | Where-Object -FilterScript {$_.IPEnabled} | ForEach-Object -Process {$_.InvokeMethod("SetDNSDomain", "fabrikam.com")}
Realizar tareas de configuración de DHCP
La modificación de la información de DHCP conlleva trabajar con un conjunto de adaptadores, como en la configuración de DNS. Se pueden realizar varias acciones distintas con WMI; recorreremos paso a paso algunas de las más comunes.
Determinar los adaptadores con DHCP habilitado
Puede usar el siguiente comando para buscar los adaptadores con DHCP habilitado en un equipo:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=true" -ComputerName .
Si no está buscando adaptadores con problemas de configuración de IP, puede restringir esta búsqueda a los adaptadores con IP habilitado:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled=true and DHCPEnabled=true" -ComputerName .
Recuperar propiedades de DHCP
Las propiedades relativas a DHCP de un adaptador comienzan generalmente por DHCP; por tanto, puede agregar un elemento de canalización Select-Object -Property DHCP* para ver información de DHCP de resumen de los adaptadores:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=true" -ComputerName . | Select-Object -Property DHCP*
Habilitar DHCP en cada adaptador
Si desea habilitar DHCP globalmente en todos los adaptadores, utilice el siguiente comando:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=true -ComputerName . | ForEach-Object -Process {$_.InvokeMethod("EnableDHCP", $null)}
También podría utilizar la instrucción Filter "IPEnabled=true and DHCPEnabled=false" para no intentar habilitar DHCP donde ya esté habilitado, pero omitir este paso no producirá ningún error.
Liberar y renovar concesiones DHCP en adaptadores específicos
Win32_NetworkAdapterConfiguration incluye los métodos ReleaseDHCPLease y RenewDHCPLease, y ambos se utilizan de la misma manera. En general, estos métodos se usan si sólo es necesario liberar o renovar direcciones para un adaptador en una subred específica. La manera más sencilla de filtrar los adaptadores en una subred es seleccionar únicamente las configuraciones de adaptadores que utilicen la puerta de enlace de esa subred. Por ejemplo, el siguiente comando libera todas las concesiones DHCP en adaptadores del equipo local que obtengan estas concesiones a partir de 192.168.1.254:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled=true and DHCPEnabled=true" -ComputerName . | Where-Object -FilterScript {$_.DHCPServer -contains "192.168.1.254"} | ForEach-Object -Process {$_.InvokeMethod("ReleaseDHCPLease",$null)}
El único cambio para renovar concesiones DHCP es invocar RenewDHCPLease en lugar de ReleaseDHCPLease:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled=true and DHCPEnabled=true" -ComputerName . | Where-Object -FilterScript {$_.DHCPServer -contains "192.168.1.254"} | ForEach-Object -Process {$_.InvokeMethod("ReleaseDHCPLease",$null)}
Nota:
Cuando se utilizan estos métodos en un equipo remoto, se puede perder el acceso al sistema remoto si se está conectado al mismo a través del adaptador con la concesión liberada o renovada.
Liberar y renovar concesiones DHCP en todos los adaptadores
Puede liberar o renovar direcciones DHCP globalmente en todos los adaptadores con los métodos Win32_NetworkAdapterConfiguration, ReleaseDHCPLeaseAll y RenewDHCPLeaseAll. No obstante, es necesario aplicar el comando a la clase de WMI, y no a un adaptador concreto, ya que la liberación y la renovación global de concesiones se realizan en la clase, no en un adaptador concreto.
Puede obtener una referencia a una clase de WMI, y no a instancias de la clase, si crea una lista de todas las clases de WMI y, a continuación, selecciona sólo la clase que desea por su nombre. Por ejemplo, este comando devuelve la clase Win32_NetworkAdapterConfiguration:
Get-WmiObject -List | Where-Object -FilterScript {$_.Name -eq "Win32_NetworkAdapterConfiguration"}
Puede tratar el comando completo como la clase y, a continuación, invocar el método ReleaseDHCPAdapterLease incluido. En el siguiente comando, los elementos de canalización Get-WmiObject y Where-Object aparecen entre paréntesis y esto fuerza que se evalúen primero:
( Get-WmiObject -List | Where-Object -FilterScript {$_.Name -eq "Win32_NetworkAdapterConfiguration"} ) .InvokeMethod("ReleaseDHCPLeaseAll", $null)
Puede utilizar el mismo formato de comando para invocar el método RenewDHCPLeaseAll:
( Get-WmiObject -List | Where-Object -FilterScript {$_.Name -eq "Win32_NetworkAdapterConfiguration"} ) .InvokeMethod("RenewDHCPLeaseAll", $null)
Crear un recurso compartido de red
Puede crear un recurso compartido de red con el método Win32_Share Create:
(Get-WmiObject -List -ComputerName . | Where-Object -FilterScript {$_.Name -eq "Win32_Share"}).InvokeMethod("Create",("C:\temp","TempShare",0,25,"test share of the temp folder"))
También puede crear el recurso compartido con net share en Windows PowerShell:
net share tempshare=c:\temp /users:25 /remark:"test share of the temp folder"
Eliminar un recurso compartido de red
Puede quitar un recurso compartido de red con Win32_Share, pero el proceso es ligeramente distinto del que se usa para crear un recurso compartido, ya que necesita recuperar el recurso compartido específico que desea quitar, en lugar de la clase Win32_Share. La siguiente instrucción elimina el recurso compartido "TempShare":
(Get-WmiObject -Class Win32_Share -ComputerName . -Filter "Name='TempShare'").InvokeMethod("Delete",$null)
También se puede utilizar el comando net share:
PS> net share tempshare /delete
tempshare se ha eliminado.
Conectar una unidad de red accesible desde Windows
New-PSDrive permite crear una unidad de Windows PowerShell, pero las unidades creadas de esta manera están disponibles únicamente en Windows PowerShell. Para crear una unidad en red, puede usar el objeto COM WScript.Network. El siguiente comando asigna el recurso compartido \\FPS01\users a la unidad local B:
(New-Object -ComObject WScript.Network).MapNetworkDrive("B:", "\\FPS01\users")
También se puede utilizar el comando net use:
net use B: \\FPS01\users
Las unidades asignadas con WScript.Network o net use están disponibles inmediatamente en Windows PowerShell.
Trabajar con archivos y carpetas
Los procedimientos para desplazarse por las unidades de Windows PowerShell y manipular los elementos que contienen son similares a los que se utilizan para manipular archivos y carpetas en unidades de disco físicas de Windows. En esta sección explicaremos cómo realizar tareas específicas de manipulación de archivos y carpetas.
Mostrar todos los archivos y carpetas que contiene una carpeta
Puede obtener todos los elementos incluidos directamente en una carpeta con Get-ChildItem. Agregue el parámetro opcional Force para mostrar los elementos ocultos o del sistema. Por ejemplo, este comando muestra el contenido directo de la unidad C de Windows PowerShell (que es el mismo que la unidad C física de Windows):
Get-ChildItem -Force C:\
Este comando, que es muy parecido al comando DIR de Cmd.exe o ls de un shell de UNIX, muestra sólo los elementos contenidos directamente. Para que se muestren los elementos contenidos, debe especificar también el parámetro - Recurse (esta operación puede tardar mucho tiempo en completarse). Para mostrar todo el contenido de la unidad C:
Get-ChildItem -Force C:\ -Recurse
Get-ChildItem puede filtrar elementos con los parámetros Path, Filter, Include y Exclude, pero éstos se basan normalmente sólo en el nombre. Puede aplicar filtros complejos basándose en otras propiedades de los elementos con Where-Object.
El siguiente comando busca todos los archivos ejecutables en la carpeta Archivos de programa que se modificaron por última vez después del 1 de octubre de 2005 y cuyo tamaño se encuentra entre 1 megabyte y 10 megabytes:
Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt "2005-10-01") -and ($_.Length -ge 1m) -and ($_.Length -le 10m)}
Copiar archivos y carpetas
Las operaciones de copia se realizan con Copy-Item. El siguiente comando crea una copia de seguridad de C:\boot.ini en C:\boot.bak:
Copy-Item -Path c:\boot.ini -Destination c:\boot.bak
Si el archivo de destino ya existe, la copia no se podrá realizar. Para sobrescribir un destino que ya existe, utilice el parámetro Force:
Copy-Item -Path c:\boot.ini -Destination c:\boot.bak -Force
Este comando se puede usar incluso con un destino de sólo lectura.
La copia de carpetas se realiza de la misma manera. Este comando copia recursivamente la carpeta C:\temp\test1 en la nueva carpeta c:\temp\DeleteMe:
Copy-Item C:\temp\test1 -Recurse c:\temp\DeleteMe
También puede copiar una selección de elementos. El siguiente comando copia todos los archivos .txt incluidos en cualquier ubicación de c:\data en c:\temp\text:
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination c:\temp\text
También se pueden usar otras herramientas para realizar copias del sistema de archivos. En Windows PowerShell se pueden utilizar objetos XCOPY, ROBOCOPY y COM, como Scripting.FileSystemObject. Por ejemplo, puede usar la clase Scripting.FileSystem COM de Windows Script Host para crear una copia de seguridad de C:\boot.ini en C:\boot.bak:
(New-Object -ComObject Scripting.FileSystemObject).CopyFile("c:\boot.ini", "c:\boot.bak")
Crear archivos y carpetas
La creación de nuevos elementos se realiza de la misma manera en todos los proveedores de Windows PowerShell. Si un proveedor de Windows PowerShell incluye varios tipos de elementos (por ejemplo, el proveedor FileSystem de Windows PowerShell distingue entre directorios y archivos), deberá especificar el tipo de elemento.
Este comando crea una nueva carpeta C:\temp\New Folder:
New-Item -Path 'C:\temp\New Folder' -ItemType "directory"
Este comando crea un nuevo archivo vacío C:\temp\New Folder\file.txt:
New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType "file"
Eliminar todos los archivos y carpetas que contiene una carpeta
Puede usar Remove-Item para quitar elementos contenidos, pero se le pedirá que confirme la eliminación si el elemento contiene algo más. Por ejemplo, si intenta eliminar la carpeta C:\temp\DeleteMe que contiene otros elementos, Windows PowerShell le solicitará confirmación antes de eliminar la carpeta:
Remove-Item C:\temp\DeleteMe
Confirmar
El elemento situado en C:\temp\DeleteMe tiene elementos secundarios y no se especificó el parámetro -recurse
Si continúa, se quitarán todos los elementos secundarios junto con el elemento. ¿Está seguro de que desea continuar?
Sí - Sí a todo [N] No [T] No a todo
Suspender [?] Ayuda
(el valor predeterminado es "S"):
Si no desea que se le pregunte por cada elemento contenido, especifique el parámetro Recurse:
Remove-Item C:\temp\DeleteMe -Recurse
Asignar una carpeta local como una unidad accesible desde Windows
También puede asignar una carpeta local con el comando subst. El siguiente comando crea una unidad local P: cuya raíz es el directorio local Archivos de programa:
subst p: $env:programfiles
Al igual que las unidades de red, las unidades asignadas en Windows PowerShell con subst se muestran inmediatamente en la sesión de Windows PowerShell.
Leer un archivo de texto en una matriz
Uno de los formatos más comunes de almacenamiento de datos de texto es un archivo con líneas independientes tratadas como elementos de datos distintos. El cmdlet Get-Content permite leer un archivo completo en un solo paso, como se muestra a continuación:
PS> Get-Content -Path C:\boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional"
/noexecute=AlwaysOff /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=" Microsoft Windows XP Professional
with Data Execution Prevention" /noexecute=optin /fastdetect
Get-Content trata los datos leídos del archivo como una matriz, con un elemento por línea de contenido del archivo. Para confirmar esto, compruebe el valor de Length del contenido devuelto:
PS> (Get-Content -Path C:\boot.ini).Length
6
Este comando es muy útil para obtener listas de información directamente en Windows PowerShell. Por ejemplo, puede almacenar una lista de nombres de equipos o direcciones IP en un archivo C:\temp\domainMembers.txt, con un nombre en cada línea del archivo. Get-Content permite recuperar el contenido del archivo y colocarlo en la variable $Computers:
$Computers = Get-Content -Path C:\temp\DomainMembers.txt
$Computers es ahora una matriz que contiene un nombre de equipo en cada elemento.
Trabajar con claves del Registro
Dado que las claves del Registro son elementos de las unidades de Windows PowerShell, trabajar con ellas es muy parecido a trabajar con archivos y carpetas. Una diferencia fundamental es que todo elemento de una unidad de Windows PowerShell basada en el Registro es un contenedor, como lo es una carpeta en una unidad del sistema de archivos. No obstante, las entradas del Registro y sus valores asociados son propiedades de los elementos, no elementos distintos.
Mostrar todas las subclaves de una clave del Registro
Puede mostrar todos los elementos incluidos directamente en una clave del Registro con Get-ChildItem. Agregue el parámetro opcional Force para mostrar los elementos ocultos o del sistema. Por ejemplo, este comando muestra los elementos incluidos directamente en la unidad HKCU: de Windows PowerShell, que corresponde al subárbol del Registro HKEY_CURRENT_USER:
PS> Get-ChildItem -Path hkcu:\
Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER
SKC VC Name Property
--- -- ---- --------
2 0 AppEvents {}
7 33 Console {ColorTable00, ColorTable01, ColorTab...
25 1 Control Panel {Opened}
0 5 Environment {APR_ICONV_PATH, INCLUDE, LIB, TEMP...}
1 7 Identities {Last Username, Last User ...
4 0 Keyboard Layout {}
...
Se trata de las claves de nivel superior mostradas en HKEY_CURRENT_USER en el Editor del Registro (Regedit.exe).
También puede especificar esta ruta de acceso al Registro si especifica el nombre del proveedor del Registro seguido de "::". El nombre completo del proveedor del Registro es Microsoft.PowerShell.Core\Registry, pero se puede abreviar como Registry. Cualquiera de los siguientes comandos enumerará el contenido que hay directamente en la unidad HKCU:
Get-ChildItem -Path Registry::HKEY_CURRENT_USER
Get-ChildItem -Path Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER
Get-ChildItem -Path Registry::HKCU
Get-ChildItem -Path Microsoft.PowerShell.Core\Registry::HKCU
Get-ChildItem HKCU:
Estos comandos enumeran sólo los elementos contenidos directamente, muy parecido al comando DIR de Cmd.exe o ls de un shell de UNIX. Para que se muestren los elementos contenidos, debe especificar el parámetro Recurse. Para enumerar todas las claves del Registro en la unidad HKCU, utilice el siguiente comando (esta operación puede tardar mucho tiempo en completarse):
Get-ChildItem -Path hkcu:\ -Recurse
Get-ChildItem permite aplicar filtros complejos con los parámetros Path, Filter, Include y Exclude, pero éstos se basan normalmente sólo en el nombre. Puede aplicar filtros complejos basándose en otras propiedades de los elementos con el cmdlet Where-Object. El siguiente comando busca todas las claves incluidas en HKCU:\Software que tengan una subclave como máximo y que tengan exactamente cuatro valores:
Get-ChildItem -Path HKCU:\Software -Recurse | Where-Object -FilterScript {($_.SubKeyCount -le 1) -and ($_.ValueCount -eq 4) }
Copiar claves
Las operaciones de copia se realizan con Copy-Item. El siguiente comando copia HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion y todas sus propiedades a HKCU:\, creando una nueva clave llamada "CurrentVersion":
Copy-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' -Destination hkcu:
Si examina esta nueva clave en el Editor del Registro o con Get-ChildItem, observará que no hay copias de las subclaves en la nueva ubicación. Para copiar todo el contenido de un contenedor, debe especificar también el parámetro - Recurse. Para aplicar el comando de copia anterior de forma recursiva, utilice este comando:
Copy-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' -Destination hkcu: -Recurse
También puede usar otras herramientas de las que ya dispone para realizar copias del sistema de archivos. Cualquier herramienta de modificación del Registro (entre ellas, reg.exe, regini.exe y regedit.exe) y objetos COM que admitan la modificación del Registro (como WScript.Shell y la clase StdRegProv de WMI) se pueden utilizar en Windows PowerShell.
Crear claves
La creación de nuevas claves en el Registro es una operación más sencilla que crear nuevos elementos en un sistema de archivos. Dado que todas las claves del Registro son contenedores, no es necesario especificar el tipo de elemento; basta con proporcionar una ruta de acceso explícita, como:
New-Item -Path hkcu:\software\_DeleteMe
También puede utilizar una ruta basada en un proveedor para especificar una clave:
New-Item -Path Registry::HKCU\_DeleteMe
Eliminar claves
La eliminación de elementos es prácticamente igual para todos los proveedores. Los siguientes comandos quitan elementos de forma silenciosa:
Remove-Item -Path hkcu:\Software\_DeleteMe
Remove-Item -Path 'hkcu:\key with spaces in the name'
Eliminar todas las claves contenidas en una clave específica
Puede quitar elementos contenidos con Remove-Item, pero se le pedirá que confirme la eliminación si el elemento contiene algo más. Por ejemplo, si intentamos eliminar la subclave HKCU:\CurrentVersion que creamos, podremos ver lo siguiente:
Remove-Item -Path hkcu:\CurrentVersion
Confirmar
El elemento situado en HKCU:\CurrentVersion\AdminDebug tiene elementos secundarios
y no se especificó el parámetor -recurse. Si continúa, se quitarán todos los secundarios junto con elemento. ¿Está seguro de que desea continuar?
Sí - Sí a todo [N] No [T] No a todo
Suspender [?] Ayuda
(el valor predeterminado es "S"):
Para eliminar elementos contenidos sin pedir confirmación, especifique el parámetro -Recurse:
Remove-Item -Path HKCU:\CurrentVersion -Recurse
Si desea quitar todos los elementos incluidos en HKCU:\CurrentVersion, pero no HKCU:\CurrentVersion, puede utilizar:
Remove-Item -Path HKCU:\CurrentVersion\* -Recurse
Trabajar con entradas del Registro
Dado que las entradas del Registro son propiedades de claves y, como tales, no se pueden examinar directamente, hay que adoptar un enfoque ligeramente distinto para trabajar con ellas.
Mostrar las entradas del Registro
Hay muchas maneras distintas de examinar entradas del Registro. La manera más sencilla es obtener los nombres de propiedades asociados a una clave. Por ejemplo, para ver los nombres de las entradas de la clave del Registro HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion, utilice Get-Item. Las claves del Registro tienen una propiedad con el nombre genérico "Property", que muestra una lista de las entradas del Registro que contiene la clave. El siguiente comando selecciona la propiedad Property y expande los elementos para que se muestren en una lista:
PS> Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion | Select-Object -ExpandProperty Property
DevicePath
MediaPathUnexpanded
Pro