Guia Basica de Windows PowerShell PDF
Guia Basica de Windows PowerShell PDF
Guia Basica de Windows PowerShell PDF
Microsoft Corporation
Publicación: septiembre de 2006
Resumen
Windows PowerShell™ es un nuevo shell de línea de comandos de Windows que se ha
diseñado expresamente para los administradores de sistemas. El shell incluye un símbolo
del sistema interactivo y un entorno de scripting que se pueden utilizar de forma
independiente o conjunta.
En este documento se describen los conceptos básicos y las funciones de Windows
PowerShell, y se sugieren formas en que se puede usar Windows PowerShell para la
administración de sistemas.
Contenido
Aviso de copyright de la Guía básica de Windows PowerShell™ .................................... 9
Cambiar el estado del equipo: bloquear, cerrar la sesión, apagar y reiniciar ................100
Bloquear un equipo ..............................................................................................100
Cerrar la sesión actual ..........................................................................................101
Apagar o reiniciar un equipo .................................................................................101
Aprendizaje sencillo
Windows PowerShell permite descubrir fácilmente sus funciones. Por ejemplo, para
obtener una lista de los cmdlets que permiten ver y cambiar servicios de Windows,
escriba:
get-command *-service
Después de descubrir qué cmdlet realiza una tarea, puede obtener más información
acerca del cmdlet en cuestión mediante el cmdlet Get-Help. Por ejemplo, para mostrar
la Ayuda acerca del cmdlet Get-Service, escriba:
get-help get-service
Para entender totalmente el resultado de este cmdlet, canalice dicho resultado al cmdlet
Get-Member. Por ejemplo, el siguiente comando muestra información acerca de los
miembros del objeto que da como resultado el cmdlet Get-Service:
get-service | get-member
11
Coherencia
La administración de sistemas puede ser una tarea compleja, y herramientas con una
interfaz común ayudan a controlar esta complejidad inherente. Por desgracia, ni las
herramientas de línea de comandos ni los objetos COM que se pueden utilizar en scripts
destacan por su coherencia.
La coherencia de Windows PowerShell constituye uno de sus valores principales.
Por ejemplo, si aprende a utilizar el cmdlet Sort-Object, podrá usar estos conocimientos
para ordenar el resultado de cualquier cmdlet. No es necesario que aprenda las distintas
rutinas de ordenación de cada cmdlet.
Además, los programadores de cmdlets no tienen que diseñar funciones de ordenación
para sus cmdlets. Windows PowerShell les proporciona un marco de trabajo con las
funciones básicas y les obliga a ser coherentes en muchos aspectos de la interfaz.
Este marco de trabajo elimina algunas de las opciones que suelen dejarse en manos
del programador pero, a cambio, la programación de cmdlets eficaces y fáciles de usar
se vuelve una tarea mucho más sencilla.
Orientación a objetos
Aunque la interacción con Windows PowerShell se realiza mediante comandos de texto,
Windows PowerShell está basado en objetos, no en texto. El resultado de un comando
es un objeto. Puede enviar el objeto de salida como entrada a otro comando.
En consecuencia, Windows PowerShell proporciona una interfaz familiar a usuarios
con experiencia en otros shells, al tiempo que introduce un nuevo y eficaz paradigma
12
Requisitos de instalación
Antes de instalar Windows PowerShell, asegúrese de que el sistema dispone de los
programas de software que necesita Windows PowerShell. Estos programas son:
Windows XP Service Pack 2, Windows 2003 Service Pack 1 o versiones posteriores
de Windows
Microsoft .NET Framework 2.0
Si ya hay instalada una versión de Windows PowerShell en el equipo, utilice Agregar o
quitar programas del Panel de control para desinstalarla antes de instalar una nueva
versión.
Por ejemplo:
PowerShellSetup_x86_fre.exe /quiet
Nota:
Windows PowerShell puede ejecutar comandos que no sean cmdlets. No los
vamos a tratar detenidamente en la Guía básica de Windows PowerShell,
pero resulta útil conocerlos como categorías de tipos de comandos. Windows
PowerShell admite scripts análogos a los scripts del shell de UNIX y los archivos
por lotes de Cmd.exe, pero tienen la extensión de nombre de archivo .ps1.
Windows PowerShell también permite crear funciones internas que pueden
utilizarse directamente en la interfaz o en scripts.
que la herramienta pase por alto lo que ha escrito y comience a realizar una tarea
automáticamente.
Cuando escriba un comando en Windows PowerShell, todo lo que escriba lo analizará
y preprocesará Windows PowerShell automáticamente. Si usa el parámetro -? con un
cmdlet de Windows PowerShell, siempre significará "muéstrame la Ayuda de este
comando". Los programadores de cmdlets no tienen que analizar el comando; sólo
tienen que proporcionar el texto de la Ayuda.
Es importante entender que las características de Ayuda de Windows PowerShell están
disponibles incluso cuando se ejecutan herramientas tradicionales de línea de comandos
en Windows PowerShell. Windows PowerShell procesa los parámetros y analiza los
resultados para las herramientas externas.
Nota:
Si ejecuta una aplicación gráfica en Windows PowerShell, se abrirá la ventana
de la aplicación. Windows PowerShell interviene únicamente al procesar la
entrada de línea de comandos proporcionada o la salida de la aplicación que se
devuelve a la ventana de la consola; no interviene en el funcionamiento interno
de la aplicación.
que son importantes para la administración del sistema. Resulta muy fácil entender
cómo estos nombres que constan de dos partes reducen el esfuerzo de aprendizaje
si observamos varios ejemplos de verbos y sustantivos.
Los sustantivos están menos limitados, pero deben describir siempre a qué se aplica un
comando. Windows PowerShell incluye comandos como Get-Process, Stop-Process,
Get-Service y Stop-Service.
En el caso de dos sustantivos y dos verbos, la coherencia no simplifica tanto el
aprendizaje. No obstante, en el caso de un conjunto estándar de 10 verbos y 10
sustantivos, tendría solamente 20 palabras que aprender, pero éstas se pueden usar
para formar 100 nombres de comandos distintos.
A menudo se reconoce la función de un comando con sólo leer su nombre, y suele ser
evidente el nombre que debe utilizarse para un comando nuevo. Por ejemplo, un
comando que apaga el equipo podría ser Stop-Computer. Un comando que enumera
todos los equipos de una red podría ser Get-Computer. El comando que obtiene la
fecha del sistema es Get-Date.
Puede obtener una lista de todos los comandos que incluyen un verbo concreto con el
parámetro -Verb de Get-Command (trataremos Get-Command en profundidad en la
siguiente sección). Por ejemplo, para ver todos los cmdlets que utilizan el verbo Get,
escriba:
PS> Get-Command -Verb Get
CommandType Name Definition
----------- ---- ----------
Cmdlet Get-Acl Get-Acl [[-Path] <String[]>]...
Cmdlet Get-Alias Get-Alias [[-Name] <String[]...
Cmdlet Get-AuthenticodeSignature Get-AuthenticodeSignature [-...
Cmdlet Get-ChildItem Get-ChildItem [[-Path] <Stri...
...
El parámetro -Noun es incluso más útil porque permite ver una familia de comandos
que se aplican al mismo tipo de objeto. Por ejemplo, si desea ver qué comandos están
disponibles para administrar servicios, escriba el siguiente comando:
PS> Get-Command -Noun Service
CommandType Name Definition
----------- ---- ----------
Cmdlet Get-Service Get-Service [[-Name] <String...
Cmdlet New-Service New-Service [-Name] <String>...
Cmdlet Restart-Service Restart-Service [-Name] <Str...
Cmdlet Resume-Service Resume-Service [-Name] <Stri...
Cmdlet Set-Service Set-Service [-Name] <String>...
Cmdlet Start-Service Start-Service [-Name] <Strin...
Cmdlet Stop-Service Stop-Service [-Name] <String...
Cmdlet Suspend-Service Suspend-Service [-Name] <Str...
...
19
Nota:
Los nombres de parámetros se utilizan siempre con un guión (-) como prefijo,
para que Windows PowerShell los identifique claramente como parámetros.
En el ejemplo de Get-Command -Name Clear-Host, el nombre del parámetro
es Name, pero se escribe como -Name.
A continuación se describen algunas de las características generales de los usos
y nombres de parámetros estándar.
Parámetros comunes
Windows PowerShell incluye varios parámetros conocidos como los parámetros
comunes. Dado que se controlan mediante el motor de Windows PowerShell, estos
parámetros se comportan de la misma manera siempre que un cmdlet los implementa.
Los parámetros comunes son WhatIf, Confirm, Verbose, Debug, Warn, ErrorAction,
ErrorVariable, OutVariable y OutBuffer.
Parámetros recomendados
Los cmdlets principales de Windows PowerShell utilizan nombres estándar para
parámetros similares. Aunque el uso de nombres de parámetros no es obligatorio,
existen unas directrices de uso explícitas a fin de fomentar la normalización.
Por ejemplo, estas directrices recomiendan llamar ComputerName a un parámetro que
haga referencia a un equipo por su nombre, en lugar de Server, Host, System, Node u
otras palabras alternativas comunes. Algunos nombres de parámetros recomendados
importantes son Force, Exclude, Include, PassThru, Path y CaseSensitive.
Dado que esta lista incluye archivos externos en la ruta de búsqueda, puede contener
miles de elementos. Resulta más útil examinar un conjunto reducido de comandos. Para
buscar comandos nativos de otros tipos, puede usar el parámetro CommandType del
cmdlet Get-Command. Aunque todavía no hemos hablado de estos tipos de comandos,
puede mostrarlos si conoce el nombre de CommandType correspondiente a una clase
de comandos.
Nota:
Aunque todavía no hemos tratado esta cuestión, el asterisco (*) es un carácter
comodín para buscar argumentos de comandos de Windows PowerShell.
22
Para mostrar todas las funciones de Windows PowerShell, escriba el siguiente comando:
PS> Get-Command -CommandType Function
Para mostrar los scripts externos que estén en la ruta de búsqueda de Windows
PowerShell, escriba el siguiente comando:
PS> Get-Command -CommandType ExternalScript
O bien
get-childitem -?
También puede ver los temas de ayuda página a página mediante las funciones man y
help. Para utilizarlas, escriba man o help seguido del nombre del cmdlet. Por ejemplo,
para mostrar la ayuda del cmdlet Get-Childitem, escriba:
man get-childitem
O bien
help get-childitem
Para mostrar un tema de ayuda específico, escriba el nombre del tema. Por ejemplo:
get-help about_line_editing
clear h ps sort
del lp r write
diff ls ren
Si observa que utiliza uno de estos comandos de manera refleja y desea conocer el
nombre real del comando nativo de Windows PowerShell, puede usar el comando
Get-Alias:
PS> Get-Alias cls
A continuación se muestra un breve ejemplo para ilustrar cómo funciona esto: el alias
estándar de Get-Item procede de combinar la g de Get y la i de Item: gi. El alias estándar
de Set-Item procede de combinar la s de Set y la i de Item: si. El alias estándar de Get-
Location procede de combinar la g de Get y la l de Location: gl. El alias estándar de Set-
Location procede de combinar la s de Set y la l de Location: sl. El alias estándar de Get-
Command procede de combinar la g de Get y cm de Command: gcm. No hay un cmdlet
llamado Set-Command, pero si lo hubiera, podríamos deducir que el alias estándar
procede de combinar la s de Set y cm de Command: scm. Además, los usuarios
familiarizados con los alias de Windows PowerShell que se encuentren con scm
podrían deducir que el alias corresponde a Set-Command.
En línea:1 carácter:10
Nota:
Esta funcionalidad está controlada por la función interna TabExpansion. Esta
función se puede modificar o reemplazar, por lo que esta explicación sólo es
una guía del comportamiento de la configuración predeterminada de Windows
PowerShell.
Para completar automáticamente un nombre de archivo o una ruta de acceso con
las opciones disponibles, escriba parte del nombre o la ruta, y presione la tecla
Tabulador. Windows PowerShell completará automáticamente el nombre con la primera
coincidencia que encuentre. Para recorrer todas las opciones disponibles, presione
repetidamente la tecla Tabulador.
En el caso de los nombres de cmdlets, esto funciona de forma ligeramente distinta.
Para completar el nombre de un cmdlet con el tabulador, escriba la primera parte
completa del nombre (el verbo) y el guión que le sigue. Puede escribir un poco más del
nombre para buscar una coincidencia parcial. Por ejemplo, si escribe get-co y presiona
la tecla Tabulador, Windows PowerShell lo completará automáticamente como Get-
Command (observe que también se cambian las letras mayúsculas o minúsculas del
nombre a su forma estándar). Si vuelve a presionar la tecla Tabulador, Windows
PowerShell lo reemplazará por el otro nombre de cmdlet coincidente, Get-Content.
Puede completar varias veces con el tabulador en una misma línea. Por ejemplo,
para completar el nombre del cmdlet Get-Content con el tabulador, escriba:
PS> Get-Con<Tabulador>
Nota:
Una limitación de este procedimiento es que las tabulaciones se interpretan
siempre como intentos de completar una palabra. Si copia y pega ejemplos
de comandos en una consola de Windows PowerShell, asegúrese de que
27
Canalización de objetos
Las canalizaciones actúan como una serie de tubos conectados. Los elementos que se
desplazan por la canalización pasan a través de cada tubo. Para crear una canalización
en Windows PowerShell, se conectan comandos con el operador de canalización "|" y
el resultado de cada comando se utiliza como entrada del siguiente.
Las canalizaciones son probablemente el concepto más valioso de las interfaces de
línea de comandos. Utilizadas correctamente, las canalizaciones no sólo reducen el
esfuerzo necesario para escribir comandos complejos, sino que también permiten ver
más fácilmente el flujo de trabajo de los comandos. Una útil característica relacionada
con las canalizaciones es que, como se aplican a cada elemento por separado, no
es necesario modificarlas en función de si la canalización va a contener cero, uno o
muchos elementos. Además, cada comando de una canalización (llamado elemento
de canalización) suele pasar su resultado al siguiente comando de la misma, elemento
a elemento. Normalmente esto reduce la demanda de recursos de los comandos
complejos y permite obtener el resultado inmediatamente.
En este capítulo, vamos a explicar en qué se diferencia la canalización de Windows
PowerShell de las canalizaciones de los shells más conocidos y, a continuación,
mostraremos algunas herramientas básicas que sirven para controlar los resultados
de la canalización y para ver cómo funcionan las canalizaciones.
Path
----
C:\
el carácter ':' y, por último, el carácter '\'. El cmdlet Out-Host no podría determinar
el significado de los caracteres del resultado del cmdlet Get-Location.
En lugar de usar texto para la comunicación entre comandos de una canalización,
Windows PowerShell usa objetos. Desde el punto de vista de un usuario, los objetos
empaquetan la información relacionada en un formato que permite manipularla
fácilmente como una unidad, así como extraer los elementos concretos que se
necesiten.
El comando Get-Location no devuelve texto con la ruta de acceso actual. Lo que
devuelve es un paquete de información, un objeto PathInfo, que contiene la ruta de
acceso actual junto con otra información. A continuación, el cmdlet Out-Host envía este
objeto PathInfo a la pantalla y Windows PowerShell decide qué información va a mostrar
y cómo la va a mostrar en función de sus reglas de formato.
De hecho, la información de encabezado que da como resultado el cmdlet Get-Location
se agrega sólo al final, como parte del proceso de aplicar formato a los datos para
su presentación en pantalla. Lo que se muestra en pantalla es un resumen de la
información, y no una representación completa del objeto de salida.
Dado que en el resultado de un comando de Windows PowerShell puede haber más
información que la que se muestra en la ventana de la consola, ¿cómo se pueden
recuperar los elementos no visibles? ¿Cómo se pueden ver los datos adicionales?
¿Cómo se pueden ver los datos en un formato distinto al que utiliza normalmente
Windows PowerShell?
En el resto de este capítulo se explica cómo puede descubrir la estructura de objetos
específicos de Windows PowerShell (mediante la selección de elementos concretos
y la aplicación de formato a estos elementos para facilitar su presentación) y cómo
puede enviar esta información a ubicaciones de salida alternativas, como archivos
e impresoras.
elementos devueltos puede ser enorme. Por ejemplo, un objeto de proceso puede
tener más de 100 miembros.
Para ver todos los miembros de un objeto Process y dividir en páginas el resultado
para así poder verlo todo, escriba:
PS> Get-Process | Get-Member | Out-Host -Paging
Puede hacer que esta larga lista de información sea más útil si la filtra por los elementos
que desea ver. El comando Get-Member permite crear una lista que sólo contenga los
miembros que son propiedades. Hay varios tipos de propiedades. El cmdlet muestra las
propiedades de cualquier tipo si establecemos Properties como valor del parámetro
Get-MemberMemberType. La lista resultante sigue siendo muy larga, pero un poco
más manejable:
PS> Get-Process | Get-Member -MemberType Properties
TypeName: System.Diagnostics.Process
Nota:
Los valores permitidos de MemberType son AliasProperty, CodeProperty,
Property, NoteProperty, ScriptProperty, Properties, PropertySet, Method,
CodeMethod, ScriptMethod, Methods, ParameterizedProperty, MemberSet y All.
Hay más de 60 propiedades para un proceso. El motivo por el que Windows PowerShell
suele mostrar únicamente un subconjunto de las propiedades de cualquier objeto
conocido es que, si los mostrara todos, el resultado sería una cantidad de información
muy difícil de manejar.
Nota:
Windows PowerShell determina cómo se va a mostrar un tipo de objeto
utilizando la información almacenada en archivos XML con nombres que
finalizan en .format.ps1xml. Los datos de formato correspondientes a objetos
de proceso, que son objetos .NET de la clase System.Diagnostics.Process,
se almacenan en PowerShellCore.format.ps1xml.
Si necesita examinar propiedades distintas de las que Windows PowerShell muestra
de manera predeterminada, deberá dar formato a los datos de salida usted mismo.
Para ello, puede utilizar los cmdlets de formato.
En el resto de esta sección, exploraremos cómo utilizar los cmdlets Format para cambiar
la manera en que se muestra el resultado de este comando.
powershell powershell
2760 3448
Id : 2760
Handles : 1242
CPU : 3.03125
Name : powershell
Id : 3448
Handles : 328
33
CPU : 1.0625
Name : powershell
ProcessName : powershell
FileVersion : 1.0.9567.1
StartTime : 2006-05-24 13:42:00
Id : 2760
ProcessName : powershell
FileVersion : 1.0.9567.1
StartTime : 2006-05-24 13:54:28
Id : 3448
Aunque el comando Format-List resulta útil para mostrar información detallada, si desea
obtener información general de resultados que contienen muchos elementos, una vista
de tabla más sencilla suele ser más conveniente.
El cmdlet Format-Table sigue truncando los datos, pero sólo al final de la pantalla. Se
proporciona a las propiedades (salvo a la última mostrada) el espacio necesario para
que el elemento de datos más largo se muestre correctamente. Si se intercambia la
ubicación de Path y Company en la lista de valores de Property, se muestra el nombre
de la compañía, pero la ruta de acceso aparece truncada:
PS> Get-Process -Name powershell | Format-Table -Property Company,Name,Id,Path -
AutoSize
El comando Format-Table supone que cuanto más próxima esté una propiedad al
principio de la lista de propiedades, más importante es. Por tanto, intenta mostrar en
su totalidad las propiedades que estén más cerca del principio. Si el comando Format-
Table no puede mostrar todas las propiedades, quitará algunas de las columnas de
la presentación y mostrará una advertencia. Puede observar este comportamiento si
establece Name como la última propiedad de la lista:
PS> Get-Process -Name powershell | Format-Table -Property Company,Path,Id,Name -
AutoSize
Company Path I
d
------- ---- -
Microsoft Corporation C:\Archivos de programa\Windows
PowerShell\v1.0\powershell.exe 6
para mostrar los elementos en una línea, como cuando se especifica AutoSize sin el
parámetro Wrap. La única diferencia es que se ajusta la última columna, si es necesario:
PS> Get-Process -Name powershell | Format-Table -Wrap -AutoSize -Property Name,I
d,Company,Path
Path Id Company
---- -- -------
C:\Archivos de programa\Windows PowerShell\v1.0\powershell.exe 2836 Microsoft
Corporat
ion
Name Id Path
---- -- ----
powershell 1956 C:\Archivos de programa\Windows PowerShell\v1.0\powershell.exe
powershell 2656 C:\Archivos de programa\Windows PowerShell\v1.0\powershell.exe
37
El cmdlet Out-Host envía los datos directamente a la consola, por lo que el comando
Format-List no recibe datos a los que aplicar formato.
La forma correcta de estructurar este comando es colocar el cmdlet Out-Host al final
de la canalización, como se muestra a continuación. Esto hace que se aplique formato
de lista a los datos de procesos antes de dividirlos en páginas y mostrarlos.
PS> Get-Process | Format-List | Out-Host -Paging
Id : 2888
Handles : 101
CPU : 0.046875
38
Name : alg
...
Id : 740
Handles : 612
CPU : 211.703125
Name : explorer
Id : 2560
Handles : 257
CPU : 3.015625
Name : explorer
...
<ESPACIO> página siguiente; <RETORNO> línea siguiente; Q salir
...
Esto es aplicable a todos los cmdlets Out. Un cmdlet Out debe aparecer siempre al final
de la canalización.
Nota:
Todos los cmdlets Out representan la salida como texto, utilizando el formato
vigente para la ventana de la consola, incluidas las limitaciones de longitud de
línea.
También puede usar la función more para dividir datos en páginas. En Windows
PowerShell, more es una función que llama a Out-Host -Paging. El siguiente comando
muestra el uso de la función more para dividir el resultado de Get-Command en páginas:
PS> Get-Command | more
Si incluye uno o más nombres de archivos como argumentos de la función more, esta
función leerá los archivos especificados y mostrará su contenido dividido en páginas
en el host:
PS> more c:\boot.ini
[boot loader]
timeout=5
39
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
...
El cmdlet Out-Null no evita que se muestren mensajes de error. Por ejemplo, si escribe
el siguiente comando, aparecerá un mensaje para informarle de que Windows
PowerShell no reconoce 'Is-NotACommand':
PS> Get-Command Is-NotACommand | Out-Null
Get-Command : El término 'Is-NotACommand' no se reconoce como un cmdlet, función,
programa
ejecutable ni archivo de script.
En línea:1 carácter:12
+ Get-Command <<<< Is-NotACommand | Out-Null
Los resultados de usar el cmdlet Out-File pueden no ser los esperados si está
acostumbrado a la redirección tradicional de la salida. Para entender este comportamiento,
debe tener en cuenta el contexto en el que se utiliza el cmdlet Out-File.
De manera predeterminada, el cmdlet Out-File crea un archivo Unicode. Esta
configuración predeterminada es la mejor a la larga, pero significa que las herramientas
que esperan archivos ASCII no funcionarán correctamente con el formato predeterminado
para los resultados. Puede cambiar este formato predeterminado a ASCII con el parámetro
Encoding:
PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt -Encoding ASCII
El cmdlet Out-File aplica formato al contenido del archivo para que se parezca al
resultado de la consola. En la mayoría de los casos, esto hace que el resultado aparezca
truncado como en una ventana de consola. Por ejemplo, si ejecuta el siguiente comando:
PS> Get-Command | Out-File -FilePath c:\temp\output.txt
Si desea no se realicen ajustes de línea el resultado obtenido para adaptar los datos al
ancho de pantalla, puede utilizar el parámetro Width para especificar el ancho de línea.
Dado que Width es un parámetro cuyo valor es un entero de 32 bits, el valor máximo
que puede contener es 2147483647. Para establecer el ancho de línea en este valor
máximo, escriba lo siguiente:
Get-Command | Out-File -FilePath c:\temp\output.txt -Width 2147483647
El cmdlet Out-File es muy útil si se desea guardar el resultado tal como se habría
mostrado en la consola. Para tener un mayor control sobre el formato de los resultados
se necesitan herramientas más avanzadas. Examinaremos estas herramientas en el
siguiente capítulo, junto con información detallada acerca de la manipulación de objetos.
Nota:
El cmdlet Get-Location es similar al comando pwd del shell BASH. El cmdlet Set-
Location es similar al comando cd de Cmd.exe.
Path
----
C:\
Path
----
HKLM:\SOFTWARE
Path
----
HKLM:\
Path
----
C:\Documents and Settings\PowerUser
Nota:
La pila de palabras tiene un significado especial en muchos entornos de
programación, incluido .NET. Al igual que en una pila física de elementos,
44
Path
----
C:\Documents and Settings\PowerUser\Configuración local\Temp
Path
----
C:\Documents and Settings\yo\Configuración local
Al igual que con el cmdlet Set-Location, puede incluir el parámetro -PassThru cuando
escriba el cmdlet Pop-Location para que se muestre el directorio que especificó:
PS> Pop-Location -PassThru
Path
----
C:\Documents and Settings\PowerUser
También puede utilizar los cmdlets Location con rutas de red. Si tiene un servidor
llamado FS01 con el recurso compartido Public, puede cambiar la ubicación con el
siguiente comando:
Set-Location \\FS01\Public
45
O bien
Push-Location \\FS01\Public
Aunque las unidades mostradas varían respecto a las unidades del sistema, la lista será
similar al resultado del comando Get-PSDrive mostrado anteriormente.
Las unidades del sistema de archivos son un subconjunto de las unidades de Windows
PowerShell. Puede identificar las unidades del sistema de archivos por la entrada
FileSystem de la columna Provider. (El proveedor FileSystem de Windows PowerShell
admite las unidades del sistema de archivos de Windows PowerShell.)
Para ver la sintaxis del cmdlet Get-PSDrive, escriba el comando Get-Command con
el parámetro Syntax:
PS> Get-Command -Name Get-PSDrive -Syntax
Get-PSDrive [[-Name] <String[]>] [-Scope <String>] [-PSProvider <String[]>] [-V
erbose] [-Debug] [-ErrorAction <ActionPreference>] [-ErrorVariable <String>] [-
OutVariable <String>] [-OutBuffer <Int32>]
Para ver las unidades de Windows PowerShell que representan subárboles del Registro,
utilice el parámetro PSProvider para que se muestren únicamente las unidades de
Windows PowerShell admitidas por el proveedor del Registro de Windows PowerShell:
PS> Get-PSDrive -PSProvider Registry
También puede utilizar los cmdlets Location estándar con las unidades de Windows
PowerShell:
PS> Set-Location HKLM:\SOFTWARE
PS> Get-Location
Path
----
HKLM:\SOFTWARE\Microsoft
Para crear una nueva unidad de Windows PowerShell, debe proporcionar tres
parámetros:
Un nombre para la unidad (puede utilizar cualquier nombre válido de Windows
PowerShell)
El valor de PSProvider (utilice "FileSystem" para ubicaciones del sistema de archivos
y "Registry" para ubicaciones del Registro)
El directorio raíz (es decir, la ruta de acceso al directorio raíz de la nueva unidad)
Por ejemplo, puede crear una unidad llamada "Office" que esté asignada a la carpeta
que contiene las aplicaciones de Microsoft Office en el equipo, como C:\Archivos de
programa\Microsoft Office\OFFICE11. Para crear la unidad, escriba el siguiente
comando:
PS> New-PSDrive -Name Office -PSProvider FileSystem -Root "C:\Archivos de programa
\Microsoft Office\OFFICE11"
Nota:
En general, las rutas de acceso no distinguen entre mayúsculas y minúsculas.
indows\CurrentVersion
A continuación, puede cambiar la ubicación a la unidad cvkey: del mismo modo que si
se tratara de cualquier otra unidad:
PS> cd cvkey:
O bien:
PS> Set-Location cvkey: -PassThru
Path
----
cvkey:\
...
Para buscar todos los archivos del directorio Windows que tengan la extensión .log
y exactamente cinco caracteres en el nombre base, escriba el siguiente comando:
PS> Get-ChildItem -Path C:\Windows\?????.log
Directorio: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows
Mode LastWriteTime Length Name
---- ------------- ------ ----
...
-a--- 2006-05-11 6:31 PM 204276 ocgen.log
-a--- 2006-05-11 6:31 PM 22365 ocmsn.log
...
-a--- 2005-11-11 4:55 AM 64 setup.log
-a--- 2005-12-15 2:24 PM 17719 VxSDM.log
...
Para buscar todos los archivos del directorio Windows que comiencen por la letra x,
escriba:
Get-ChildItem -Path C:\Windows\x*
Para buscar todos los archivos cuyo nombre comience por la letra x o z, escriba:
Get-ChildItem -Path C:\Windows\[xz]*
Directorio: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS\System32
No se obtienen resultados, aunque hay dos archivos DLL que comienzan por la letra "z"
en la carpeta Windows.
El motivo por el que no se devuelven resultados es que hemos especificado el carácter
comodín como parte de la ruta de acceso. Aunque el comando era recursivo, el cmdlet
Get-ChildItem ha limitado los elementos a los incluidos en la carpeta de Windows cuyo
nombre termina en ".dll".
Para especificar una búsqueda recursiva de archivos cuyo nombre coincide con un
patrón especial, utilice el parámetro –Include:
PS> Get-ChildItem -Path C:\Windows -Include *.dll -Recurse -Exclude [a-y]*.dll
Directorio: Microsoft.Windows
PowerShell.Core\FileSystem::C:\Windows\System32\Setup
Para crear un archivo, cambie el valor del parámetro ItemType a "file". Por ejemplo,
para crear un archivo llamado "file1.txt" en el directorio New.Directory, escriba:
PS> New-Item -Path C:\temp\New.Directory\file1.txt -ItemType file
Directorio: Microsoft.Windows
PowerShell.Core\FileSystem::C:\temp\New.Directory
Puede aplicar la misma técnica para crear una clave del Registro. De hecho, resulta
más fácil crear una clave del Registro porque el único tipo de elemento que puede
encontrarse en el Registro de Windows es una clave (las entradas del Registro son
propiedades de elementos). Por ejemplo, para crear una clave llamada "_Test" en la
subclave CurrentVersion, escriba:
PS> New-Item -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\_Test
Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Windows\CurrentVersion
Cuando escriba una ruta de acceso al Registro, asegúrese de incluir los dos puntos (:)
en los nombres de las unidades HKLM: y HKCU: de Windows PowerShell. Sin los dos
puntos, Windows PowerShell no reconocerá el nombre de la unidad en la ruta de
acceso.
Aunque resultaría cómodo tratar las entradas del Registro como elementos, no es
posible especificar una ruta de acceso a una entrada del Registro de una manera que
garantice que es única. La notación de rutas de acceso no distingue entre la subclave
del Registro Run y la entrada del Registro (Default) de la subclave Run. Además, dado
que los nombres de entradas del Registro pueden contener la barra diagonal inversa (\),
si se trataran las entradas del Registro como elementos, no se podría utilizar la notación
de rutas de acceso para distinguir una entrada del Registro llamada
Windows\CurrentVersion\Run de la subclave ubicada en esa ruta de acceso.
Directorio: Microsoft.Windows
PowerShell.Core\FileSystem::C:\temp\New.Directory
Confirmar
El elemento situado en C:\temp\New.Directory tiene elementos secundarios y no se
especificó el parámetro -recurse. Si continúa, se quitarán todos los secundarios
junto con el elemento. ¿Está seguro de que desea continuar?
[S] Sí [O] Sí a todo [N] No [T] No a todo [S] Suspender [?] Ayuda
(el valor predeterminado es "S"):
Dado que la respuesta predeterminada es Sí, para eliminar la carpeta y los archivos que
contiene, deberá presionar la tecla Entrar. Para quitar la carpeta sin que se solicite
confirmación, utilice el parámetro -Recurse.
PS> Remove-Item C:\temp\New.Directory -Recurse
Si el tipo de archivo .ini está asociado al Bloc de notas, el archivo boot.ini se abrirá en
esta aplicación.
59
__SecurityRelatedClass __NTLMUser9X
__PARAMETERS __SystemSecurity
__NotifyStatus __ExtendedStatus
Win32_PrivilegesStatus Win32_TSNetworkAdapterSettingError
Win32_TSRemoteControlSettingError Win32_TSEnvironmentSettingError
60
...
__SystemClass __NAMESPACE
__Provider __Win32Provider
__ProviderRegistration __ObjectProviderRegistration
...
La lista de clases devuelta por los equipos remotos puede variar en función del sistema
operativo que se ejecute en el equipo y de las extensiones de WMI agregadas por las
aplicaciones instaladas.
Nota:
Cuando se utiliza Get-WmiObject para conectar con un equipo remoto, en dicho
equipo debe estar ejecutándose WMI y, con la configuración predeterminada,
la cuenta que se esté utilizando debe pertenecer al grupo de administradores
locales. No es necesario que el sistema remoto tenga instalado Windows
PowerShell. Esto permite administrar sistemas operativos que no ejecutan
Windows PowerShell, pero que disponen de WMI.
Incluso puede especificar el parámetro ComputerName al conectarse al sistema local.
Como nombre de equipo puede usar el nombre del equipo local, su dirección IP
(o la dirección de bucle invertido 127.0.0.1) o el punto ('.') de WMI. Si ejecuta Windows
PowerShell en un equipo llamado Admin01 con dirección IP 192.168.1.90, los comandos
siguientes devolverán la lista de clases de WMI del equipo:
Get-WmiObject -List
Get-WmiObject -List -ComputerName .
Get-WmiObject -List -ComputerName Admin01
Get-WmiObject -List -ComputerName 192.168.1.90
Get-WmiObject -List -ComputerName 127.0.0.1
Get-WmiObject -List -ComputerName localhost
__SystemClass __NAMESPACE
__Provider __Win32Provider
61
...
SystemDirectory : C:\WINDOWS\system32
Organization : Global Network Solutions
BuildNumber : 2600
RegisteredUser : Oliver W. Jones
SerialNumber : 12345-678-9012345-67890
Version : 5.1.2600
TypeName: System.Management.ManagementObject#root\cimv2\Win32_OperatingSyste
m
Nota:
Se pueden utilizar caracteres comodín con nombres de propiedades en Format-
Table, de manera que el último elemento de la canalización se puede reducir a
Format-Table -Property TotalV*,Free*.
Puede facilitar la lectura de los datos de memoria si les aplica formato de lista mediante
el siguiente comando:
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName
. | Format-List
TotalVirtualMemorySize,TotalVisibleMemorySize,FreePhysicalMemory,FreeVirtualMemory
,FreeSpaceInPagingFiles
TotalVirtualMemorySize : 2097024
TotalVisibleMemorySize : 785904
FreePhysicalMemory : 301876
FreeVirtualMemory : 2056724
FreeSpaceInPagingFiles : 1556644
63
Nota:
Puesto que la mayoría de las clases .NET principales están incluidas en el
espacio de nombres System, si Windows PowerShell no encuentra el nombre
de tipo que especifique, automáticamente intentará buscarlo en este espacio
de nombres. Esto significa que puede especificar Diagnostics.EventLog en
lugar de System.Diagnostics.EventLog.
TypeName: System.Diagnostics.EventLog
Aunque la mayoría de las funciones de estas clases están disponibles de otras maneras
en Windows PowerShell, algunas tareas, como la creación de accesos directos, son más
fáciles con clases de WSH.
Get-Member se puede usar con objetos COM, por lo que puede explorar los miembros
del objeto si escribe:
PS> $WshShell | Get-Member
67
TypeName: System.__ComObject#{41904400-be18-11d3-a28b-00104bd35090}
Nota:
Get-Member cuenta con el parámetro opcional InputObject, que puede utilizar
en lugar de la canalización para proporcionar la entrada de Get-Member. Puede
obtener el mismo resultado con el comando Get-Member -InputObject
$WshShell. Si usa InputObject, tratará su argumento como un único elemento.
Por tanto, si una variable contiene varios objetos, Get-Member los tratará como
una matriz de objetos. Por ejemplo:
PS> $a = 1,2,"tres"
TypeName: System.Object[]
...
Nota:
Si especifica algo parecido al nombre de una variable entre comillas dobles,
Windows PowerShell intentará reemplazar un valor que coincida. Si lo especifica
entre comillas simples, Windows PowerShell no intentará reemplazar el valor de
la variable. Por ejemplo, pruebe a escribir los siguientes comandos:
PS> "$Home\Escritorio\PSHome.lnk"
PS> '$Home\Escritorio\PSHome.lnk'
$Home\Escritorio\PSHome.lnk
Ahora tenemos una variable llamada $lnk que contiene una nueva referencia de acceso
directo. Para ver sus miembros, puede canalizarla a Get-Member. El resultado siguiente
muestra los miembros que debemos utilizar para terminar de crear el acceso directo:
PS> $lnk | Get-Member
TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}
...
...
...
$lnk.Save()
técnicas para trabajar con aplicaciones basadas en COM y los problemas que suelen
surgir.
Para crear una instancia de Internet Explorer, debe especificar su ProgID,
InternetExplorer.Application:
$ie = New-Object -ComObject InternetExplorer.Application
Nota:
Los objetos COM que se inician como procesos independientes, llamados
habitualmente ejecutables ActiveX, pueden mostrar o no una ventana de interfaz
de usuario cuando se inician. Si crean una ventana pero no la muestran, como
Internet Explorer, el foco se desplaza generalmente al escritorio de Windows y
será necesario que haga visible la ventana para poder interactuar con ella.
Si escribe $ie | Get-Member, puede ver las propiedades y los métodos para Internet
Explorer. Para que se muestre la ventana de Internet Explorer, establezca la propiedad
Visible en $true; para ello, escriba:
$ie.Visible = $true
Después puede desplazarse a una dirección Web específica con el método Navigate:
$ie.Navigate("http://www.microsoft.com/technet/scriptcenter/default.mspx")
Otros miembros del modelo de objetos de Internet Explorer permiten recuperar contenido
de texto de la página Web. El siguiente comando muestra el texto HTML de la página
web actual:
$ie.Document.Body.InnerText
Para cerrar Internet Explorer desde PowerShell, llame al método Quit() correspondiente:
$ie.Quit()
Esto hará que se cierre. La variable $ie ya no contiene una referencia válida, aunque
sigue pareciendo un objeto COM. Si intenta utilizarla, aparecerá un error de
automatización:
PS> $ie | Get-Member
Get-Member : Excepción al recuperar la representación de cadena de la propiedad
70
Puede quitar la referencia que queda con un comando como $ie = $null, o quitar
totalmente la variable mediante el comando:
Remove-Variable ie
Nota:
No hay un estándar común en lo que respecta a que los ejecutables ActiveX se
cierren o sigan ejecutándose cuando se quita una referencia a uno de ellos.
Según sean las circunstancias (por ejemplo, si la aplicación está visible, si hay
abierto un documento modificado en la aplicación e incluso si se está ejecutando
Windows PowerShell), la aplicación puede cerrarse o no. Por este motivo, debe
comprobar el comportamiento de finalización de cada ejecutable ActiveX que
desee utilizar en Windows PowerShell.
Estos errores se producen porque no hay manera de crear un objeto a partir de estas
clases. Estas clases son bibliotecas de referencia de métodos y propiedades que no
cambian el estado. No es necesario crearlas, basta con utilizarlas. Las clases y métodos
de este tipo reciben el nombre de clases y métodos estáticos porque no se crean,
destruyen ni modifican. Para aclarar esta cuestión, proporcionaremos algunos ejemplos
en los que se usan clases estáticas.
Nota:
Como hemos mencionado anteriormente, Windows PowerShell antepone
automáticamente 'System.' a los nombres de tipos cuando se utiliza New-
Object. Lo mismo ocurre cuando se usa un nombre de tipo entre corchetes;
por tanto, puede especificar [System.Environment] como [Environment].
La clase System.Environment contiene información general acerca del entorno de
trabajo del proceso actual, que es powershell.exe cuando se trabaja en Windows
PowerShell.
Si intenta ver información detallada de esta clase con [System.Environment] |
Get-Member, el tipo de objeto mostrado será System.RuntimeType, no
System.Environment:
PS> [System.Environment] | Get-Member
TypeName: System.RuntimeType
Para ver los miembros estáticos con Get-Member, especifique el parámetro Static:
PS> [System.Environment] | Get-Member -Static
TypeName: System.Environment
Para comprobar la versión del sistema operativo debe mostrar el valor de la propiedad
OSVersion; para ello, escriba:
PS> [System.Environment]::OSVersion
Nota:
System.Math tiene varios métodos con el mismo nombre, pero se distinguen por
el tipo de sus parámetros.
Para obtener una lista de los métodos de la clase System.Math, escriba el siguiente
comando:
PS> [System.Math] | Get-Member -Static -MemberType Methods
TypeName: System.Math
Nota:
De manera predeterminada, cuando se trabaja con texto, los operadores de
comparación de Windows PowerShell no distinguen entre mayúsculas y
minúsculas.
Para facilitar el análisis del código no se utilizan los símbolos <, > y = como operadores
de comparación. En su lugar, los operadores de comparación están formados por letras.
En la siguiente tabla se muestran los operadores de comparación básicos:
Los bloques de script de Where-Object usan la variable especial '$_' para hacer
referencia al objeto actual en la canalización. A continuación se muestra un ejemplo de
cómo funciona. Si tiene una lista de números y desea que sólo se devuelvan los que
sean inferiores a 3, puede utilizar Where-Object para filtrar los números; para ello,
escriba:
PS> 1,2,3,4 | Where-Object -FilterScript {$_ -lt 3}
1
2
La lista generada seguirá siendo muy larga. Quizá desee filtrar de manera que se
seleccionen sólo los controladores que se inician automáticamente mediante una prueba
del valor de StartMode:
PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State
-eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Auto"}
Esto proporciona mucha información que no necesitamos, puesto que sabemos que los
controladores se están ejecutando. De hecho, probablemente la única información que
necesitamos en este momento son el nombre común y el nombre para mostrar. El
siguiente comando incluye únicamente estas dos propiedades, por lo que la salida es
mucho más sencilla:
PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State
-eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Manual"} | Format-
Table -Property Name,DisplayName
Name DisplayName
---- -----------
AsyncMac RAS Asynchronous Media Driver
Fdc Floppy Disk Controller Driver
Flpydisk Floppy Disk Driver
Gpc Generic Packet Classifier
IpNat IP Network Address Translator
mouhid Mouse HID Driver
MRxDAV WebDav Client Redirector
mssmbios Microsoft System Management BIOS Driver
DeviceID : C:
DriveType : 3
ProviderName :
FreeSpace : 50665070592
Size : 203912880128
VolumeName : Local Disk
Por desgracia, ahora el resultado son datos que no tienen asociadas etiquetas. Dado
que las propiedades de WMI de este tipo son de sólo lectura, no puede convertir
directamente FreeSpace. Si escribe esto:
Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {$_.FreeSpace =
($_.FreeSpace)/1024,0/1024,0}
Podría reorganizar los datos con algunas técnicas avanzadas, pero un método más
sencillo es crear un nuevo objeto, con Select-Object.
Name FreeSpace
---- ---------
C: 50664845312
No podrá ver el tipo de datos después de emitir este comando, pero si canaliza el
resultado a Get-Member después de Select-Object, podrá ver que tiene un nuevo tipo de
objeto, un PSCustomObject:
PS> Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property
Name,FreeSpace| Get-Member
TypeName: System.Management.Automation.PSCustomObject
Ordenar objetos
Podemos organizar los datos mostrados para facilitar su búsqueda con el cmdlet Sort-
Object. Este cmdlet utiliza el nombre de una o más propiedades para ordenar y
devuelve los datos ordenados por los valores de estas propiedades.
Considere el problema que supone enumerar las instancias de Win32_SystemDriver. Si
desea ordenar por State y luego por Name, debe escribir:
Get-WmiObject -Class Win32_SystemDriver | Sort-Object -Property State,Name |
Format-Table -Property Name,State,Started,DisplayName -AutoSize -Wrap
Aunque la presentación es larga, puede observar que los elementos con el mismo
estado están agrupados:
Name State Started DisplayName
---- ----- ------- -----------
ACPI Running True Microsoft ACPI Driver
AFD Running True AFD
AmdK7 Running True AMD K7 Processor Driver
AsyncMac Running True RAS Asynchronous Media Driver
...
Abiosdsk Stopped False Abiosdsk
ACPIEC Stopped False ACPIEC
aec Stopped False Microsoft Kernel Acoustic Echo Canceller
...
81
No se devuelven resultados porque $loc no tiene un valor. Puede crear una variable y
asignarle un valor en el mismo paso. Windows PowerShell crea sólo la variable si no
existe; de lo contrario, asigna el valor especificado a la variable existente. Para
almacenar la ubicación actual en la variable $loc, escriba:
$loc = Get-Location
Path
----
C:\temp
Puede utilizar Get-Member para mostrar información acerca del contenido de variables.
La canalización de $loc a Get-Member mostrará que se trata de un objeto PathInfo, el
mismo resultado que se obtiene con Get-Location:
PS> $loc | Get-Member -MemberType Property
TypeName: System.Management.Automation.PathInfo
Manipular variables
Windows PowerShell incluye varios comandos que permiten manipular variables. Para
ver una lista completa en un formato legible, escriba:
Get-Command -Noun Variable | Format-Table -Property Name,Definition -AutoSize -
Wrap
Además de las variables que cree en la sesión actual de Windows PowerShell, hay
varias variables definidas por el sistema. Puede utilizar el cmdlet Remove-Variable para
borrar todas las variables no controladas por Windows PowerShell. Para borrar todas las
variables, escriba el siguiente comando:
Remove-Variable -Name * -Force -ErrorAction SilentlyContinue
Aunque los cmdlets de variables estándar no están diseñados para trabajar con
variables env:, puede utilizarlos si especifica el prefijo env:. Por ejemplo, para ver el
directorio raíz del sistema operativo, puede usar la variable %SystemRoot% del shell
de comandos desde Windows PowerShell:
PS> $env:SystemRoot
C:\WINDOWS
Aunque es normal que los cmdlets no devuelvan datos en algunas situaciones, cuando
se especifica un proceso por su ProcessId, Get-Process genera un error si no encuentra
coincidencias, ya que lo que intenta normalmente es recuperar un proceso conocido que
se esté ejecutando. Si no hay ningún proceso con ese Id., lo más probable es que el Id.
no sea el correcto o que el proceso en cuestión ya se haya cerrado:
PS> Get-Process -Id 99
Get-Process : No se encuentra ningún proceso con el identificador 99.
En línea:1 carácter:12
+ Get-Process <<<< -Id 99
El parámetro Name admite el uso de caracteres comodín, por lo que puede escribir los
primeros caracteres de un nombre seguidos de un asterisco para obtener una lista:
PS> Get-Process -Name ex*
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
234 7 5572 12484 134 2.98 1684 EXCEL
555 15 34500 12384 134 105.25 728 explorer
Nota:
Como la base para los procesos de Windows PowerShell es la clase
System.Diagnostics.Process de .NET, Windows PowerShell sigue algunas
de las convenciones que utiliza System.Diagnostics.Process. Una de estas
convenciones es que el nombre de proceso correspondiente a un archivo
ejecutable no puede contener nunca ".exe" al final del nombre del ejecutable.
Get-Process acepta también varios valores para el parámetro Name. Como cuando se
especifica un único nombre, aparecerá un error si no se encuentran coincidencias con un
nombre, aunque también obtendrá el resultado habitual para procesos que coincidan:
PS> Get-Process -Name exp*,power*,NotAProcess
Get-Process : No se encuentra ningún proceso con el nombre 'NotAProcess'.
En línea:1 carácter:12
+ Get-Process <<<< -Name exp*,power*,svchost,NotAProcess
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
540 15 35172 48148 141 88.44 408 explorer
605 9 30668 29800 155 7.11 3052 powershell
permisos que tenga. Algunos procesos no se pueden detener. Por ejemplo, si intenta
detener el proceso inactivo, aparecerá un error:
PS> Stop-Process -Name Idle
Stop-Process : No se puede detener el proceso 'Idle (0)' debido al error
siguiente:
Acceso denegado
En línea:1 carácter:13
+ Stop-Process <<<< -Name Idle
Puede manipular procesos complejos con algunos de los cmdlets para filtrar objetos.
Dado que un objeto Process tiene una propiedad Responding con el valor True cuando
ya no responde, puede detener todas las aplicaciones que dejen de responder con el
siguiente comando:
Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process
Puede aplicar el mismo enfoque en otras situaciones. Por ejemplo, supongamos que una
aplicación secundaria de la bandeja del sistema se ejecuta automáticamente cuando los
usuarios inician otra aplicación. Puede que no desee mantener este comportamiento en
sesiones de Servicios de Terminal Server, pero sí en sesiones que se ejecuten en la
consola del equipo físico. Las sesiones conectadas al escritorio de un equipo físico
tienen siempre el Id. de sesión 0; por tanto, puede detener todas las instancias del
proceso que se encuentren en otras sesiones con Where-Object y el proceso,
SessionId:
Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} |
Stop-Process
87
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
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
89
(Spooler)'...
PS>
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]*.
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
92
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
BuildNumber : 2600
BuildType : Uniprocessor Free
OSType : 18
ServicePackMajorVersion : 2
ServicePackMinorVersion : 0
93
DeviceID : C:
DriveType : 3
ProviderName :
FreeSpace : 65541357568
Size : 203912880128
VolumeName : Local Disk
DeviceID : Q:
DriveType : 3
ProviderName :
FreeSpace : 44298250240
Size : 122934034432
VolumeName : New Volume
Day : 15
DayOfWeek : 4
Hour : 12
Milliseconds :
Minute : 11
Month : 6
Quarter : 2
Second : 52
WeekInMonth : 3
Year : 2006
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
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".
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]*
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
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
98
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
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
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")
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)
$_.GetValue("UninstallString") }
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
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.
---------
{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
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.
104
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*
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'" -
105
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." + $_}
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")}
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.
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"
109
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)}
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")
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.
112
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.
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
113
$Computers es ahora una matriz que contiene un nombre de equipo en cada elemento.
Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER
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
115
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'
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í [O] Sí a todo [N] No [T] No a todo [S] Suspender [?] Ayuda
(el valor predeterminado es "S"):
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SO
FTWARE\Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SO
FTWARE\Microsoft\Windows
PSChildName : CurrentVersion
117
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
DevicePath : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir : C:\Archivos de programa
CommonFilesDir : C:\Archivos de programa\Archivos comunes
ProductId : 76487-338-1167776-22465
WallPaperDir : C:\WINDOWS\Web\Wallpaper
MediaPath : C:\WINDOWS\Media
ProgramFilesPath : C:\Archivos de programa
PF_AccessoriesName : Accesorios
(default) :
Todas las propiedades de la clave relativas a Windows PowerShell tienen el prefijo "PS",
como PSPath, PSParentPath, PSChildName y PSProvider.
Puede usar la notación "." para hacer referencia a la ubicación actual. Puede utilizar
Set-Location para cambiar primero al contenedor del Registro CurrentVersion:
Set-Location -Path
Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
Después puede usar la notación "." para la ubicación actual y crear una lista de las
propiedades sin especificar una ruta de acceso completa:
PS> Get-ItemProperty -Path .
...
DevicePath : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir : C:\Archivos de programa
...
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\
Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\
Microsoft\Windows
PSChildName : CurrentVersion
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
DevicePath : C:\WINDOWS\inf
Este comando devuelve las propiedades estándar de Windows PowerShell, así como la
propiedad DevicePath.
Nota:
Aunque Get-ItemProperty cuenta con los parámetros Filter, Include y Exclude,
no se pueden usar para filtrar por nombre de propiedad. Estos parámetros hacen
referencia a claves del Registro (que son rutas de acceso a elementos) y no a
entradas del Registro (que son propiedades de elementos).
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
DevicePath REG_EXPAND_SZ %SystemRoot%\inf
También puede usar el objeto WshShell COM para buscar algunas entradas del
Registro, aunque este método no se puede usar con datos binarios de gran tamaño ni
con nombres de entradas del Registro que contengan caracteres como "\"). Anexe el
nombre de la propiedad a la ruta de acceso al elemento con un separador \:
PS> (New-Object -ComObject
WScript.Shell).RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DevicePath"
)
%SystemRoot%\inf
119
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWAR
E\Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWAR
E\Microsoft\Windows
PSChildName : CurrentVersion
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
PowerShellPath : C:\Archivos de programa\Windows PowerShell\v1.0
Nota:
Para agregar una entrada del Registro a varias ubicaciones debe especificar una
matriz de valores para el parámetro Path:
New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion,
HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath -PropertyType
120
También puede sobrescribir el valor de una entrada del Registro que ya existe si agrega
el parámetro Force a cualquier comando New-ItemProperty.
Para mostrar el valor con el nuevo nombre, agregue el parámetro PassThru al comando:
Rename-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name
PowerShellPath -NewName PSHome -passthru
Nota:
Puede buscar el comando de PowerShell al que corresponde cualquier alias en
PowerShell con Get-Alias. Por ejemplo:
PS> Get-Alias cls
CommandType Name Definition
121
copy cp Copy-Item ci
move mv Move-Item mi
cd cd Set-Location sl
md mkdir New-Item ni