Usar Internet Explorer desde Windows PowerShell
Muchas aplicaciones (incluida la familia de aplicaciones Microsoft Office e Internet Explorer) se pueden automatizar mediante COM. Internet Explorer ilustra algunas de las 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
Este comando inicia Internet Explorer, pero no lo muestra. Si escribe Get-Process, podrá observar que se está ejecutando un proceso llamado iexplore. De hecho, si cierra Windows PowerShell, el proceso seguirá ejecutándose. Deberá reiniciar el equipo o utilizar una herramienta como el Administrador de tareas para finalizar el proceso iexplore.
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 "Application" : "El objeto invocado ha desconectado de sus clientes. (Exception from HRESULT: 0x80010108 (RPC_E_DISCONNECTED))"
En línea:1 carácter:16
+ $ie | Get-Member <<<<
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.
Obtener advertencias acerca de objetos COM contenidos en .NET
En algunos casos, un objeto COM puede tener asociado un contenedor al que se puede llamar en tiempo de ejecución de .NET. Este contenedor se puede utilizar en New-Object. Dado que el comportamiento del contenedor puede ser distinto al del objeto COM normal, New-Object cuenta con un parámetro Strict que le avisa del acceso al contenedor. Si especifica el parámetro Strict y, a continuación, crea un objeto COM que usa un contenedor, aparecerá un mensaje de advertencia:
PS> $xl = New-Object -ComObject Excel.Application -Strict
New-Object : El objeto escrito en la canalización es una instancia del tipo "Mic
rosoft.Office.Interop.Excel.ApplicationClass" del ensamblado de interoperabilidad
primario del componente. Si este tipo expone miembros distintos a los de IDispatch
, los scripts escritos para trabajar con este objeto podrían no funcionar si no
está instalado el ensamblado.
En línea:1 carácter:17
+ $xl = New-Object <<<< -ComObject Excel.Application -Strict
Aunque se crea el objeto, se le avisará de que no es un objeto COM estándar.
Usar clases y métodos estáticos
No todas las clases de .NET Framework se pueden crear con New-Object. Por ejemplo, si intenta crear un objeto System.Environment o System.Math con New-Object, aparecerán estos mensajes de error:
PS> New-Object System.Environment
New-Object : No se encontró el constructor. No se encuentra ningún constructor adecuado para
el tipo System.Environment.
En línea:1 carácter:11
+ New-Object <<<< System.Environment
PS> New-Object System.Math
New-Object : No se encontró el constructor. No se encuentra ningún constructor adecuado para
el tipo System.Math.
En línea:1 carácter:11
+ New-Object <<<< System.Math
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.
Obtener datos de entorno con System.Environment
Normalmente, el primer paso cuando se trabaja con un objeto en Windows PowerShell es utilizar Get-Member para averiguar qué miembros contiene. Con las clases estáticas, el proceso es ligeramente distinto porque la clase no es un objeto.
Hacer referencia a la clase estática System.Environment
Para hacer referencia a una clase estática debe especificar el nombre de la clase entre corchetes. Por ejemplo, puede hacer referencia a System.Environment si escribe el nombre entre corchetes. Al hacerlo, se mostrará información general sobre el tipo:
PS> [System.Environment]
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False Environment System.Object
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
Name MemberType Definition
---- ---------- ----------
Equals Method static System.Boolean Equals(Object ob...
Exit Method static System.Void Exit(Int32 exitCode)
...
CommandLine Property static System.String CommandLine {get;}
CurrentDirectory Property static System.String CurrentDirectory ...
ExitCode Property static System.Int32 ExitCode {get;set;}
HasShutdownStarted Property static System.Boolean HasShutdownStart...
MachineName Property static System.String MachineName {get;}
NewLine Property static System.String NewLine {get;}
OSVersion Property static System.OperatingSystem OSVersio...
ProcessorCount Property static System.Int32 ProcessorCount {get;}
StackTrace Property static System.String StackTrace {get;}
SystemDirectory Property static System.String SystemDirectory {...
TickCount Property static System.Int32 TickCount {get;}
UserDomainName Property static System.String UserDomainName {g...
UserInteractive Property static System.Boolean UserInteractive ...
UserName Property static System.String UserName {get;}
Version Property static System.Version Version {get;}
WorkingSet Property static System.Int64 WorkingSet {get;}
TickCount ExitCode
Ahora puede seleccionar las propiedades de System.Environment que desea ver.
Mostrar las propiedades estáticas de System.Environment
Las propiedades de System.Environment también son estáticas y deben especificarse de forma distinta que las propiedades normales. Utilizamos :: para indicar a Windows PowerShell que queremos usar un método o propiedad estáticos. Para ver el comando que se utilizó para iniciar Windows PowerShell, podemos comprobar el valor de la propiedad CommandLine; para ello, escriba:
PS> [System.Environment]::Commandline
"C:\Archivos de programa\Windows PowerShell\v1.0\powershell.exe"
Para comprobar la versión del sistema operativo debe mostrar el valor de la propiedad OSVersion; para ello, escriba:
PS> [System.Environment]::OSVersion
Platform ServicePack Version VersionString
-------- ----------- ------- -------------
Win32NT Service Pack 2 5.1.2600.131072 Microsoft Window...
Para comprobar si el equipo se está apagando, puede mostrar el valor de la propiedad HasShutdownStarted:
PS> [System.Environment]::HasShutdownStarted
False
Operaciones matemáticas con System.Math
La clase estática System.Math resulta útil para realizar algunas operaciones matemáticas. Los miembros importantes de System.Math son principalmente métodos, que podemos mostrar con Get-Member.
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
Name MemberType Definition
---- ---------- ----------
Abs Method static System.Single Abs(Single value), static Sy...
Acos Method static System.Double Acos(Double d)
Asin Method static System.Double Asin(Double d)
Atan Method static System.Double Atan(Double d)
Atan2 Method static System.Double Atan2(Double y, Double x)
BigMul Method static System.Int64 BigMul(Int32 a, Int32 b)
Ceiling Method static System.Double Ceiling(Double a), static Sy...
Cos Method static System.Double Cos(Double d)
Cosh Method static System.Double Cosh(Double value)
DivRem Method static System.Int32 DivRem(Int32 a, Int32 b, Int3...
Equals Method static System.Boolean Equals(Object objA, Object ...
Exp Method static System.Double Exp(Double d)
Floor Method static System.Double Floor(Double d), static Syst...
IEEERemainder Method static System.Double IEEERemainder(Double x, Doub...
Log Method static System.Double Log(Double d), static System...
Log10 Method static System.Double Log10(Double d)
Max Method static System.SByte Max(SByte val1, SByte val2), ...
Min Method static System.SByte Min(SByte val1, SByte val2), ...
Pow Method static System.Double Pow(Double x, Double y)
ReferenceEquals Method static System.Boolean ReferenceEquals(Object objA...
Round Method static System.Double Round(Double a), static Syst...
Sign Method static System.Int32 Sign(SByte value), static Sys...
Sin Method static System.Double Sin(Double a)
Sinh Method static System.Double Sinh(Double value)
Sqrt Method static System.Double Sqrt(Double d)
Tan Method static System.Double Tan(Double a)
Tanh Method static System.Double Tanh(Double value)
Truncate Method static System.Decimal Truncate(Decimal d), static...
Se muestran varios métodos matemáticos. A continuación se muestra una lista de comandos que demuestran cómo se usan algunos métodos comunes:
PS> [System.Math]::Sqrt(9)
3
PS> [System.Math]::Pow(2,3)
8
PS> [System.Math]::Floor(3.3)
3
PS> [System.Math]::Floor(-3.3)
-4
PS> [System.Math]::Ceiling(3.3)
4
PS> [System.Math]::Ceiling(-3.3)
-3
PS> [System.Math]::Max(2,7)
7
PS> [System.Math]::Min(2,7)
2
PS> [System.Math]::Truncate(9.3)
9
PS> [System.Math]::Truncate(-9.3)
-9
Eliminar objetos de la canalización (Where-Object)
En Windows PowerShell, a menudo se generan y pasan a una canalización más objetos de los deseados. Puede especificar las propiedades de objetos específicos que desee mostrar mediante los cmdlets Format, pero esto no ayuda a quitar objetos completos de la presentación. Quizá desee filtrar objetos antes del final de una canalización, para así poder realizar acciones sólo en un subconjunto de los objetos generados inicialmente.
Windows PowerShell incluye un cmdlet Where-Object que permite probar cada objeto de la canalización y pasarlo por ésta sólo si cumple una determinada condición de prueba. Los objetos que no superen la prueba se quitan de la canalización. La condición de prueba se proporciona como el valor del parámetro Where-ObjectFilterScript.
Realizar pruebas sencillas con Where-Object
El valor de FilterScript es un bloque de script (uno o más comandos de Windows PowerShell especificados entre llaves {}) que se evalúa como True o False. Estos bloques de script pueden ser muy sencillos, pero para crearlos hay que conocer otro concepto de Windows PowerShell: los operadores de comparación. Un operador de este tipo compara los elementos que aparecen a cada lado del mismo. Los operadores de comparación comienzan por un carácter '-' seguido de un nombre. Los operadores de comparación básicos se pueden usar con prácticamente cualquier tipo de objeto, mientras que algunos de los más avanzados sólo pueden utilizarse con texto o matrices.
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:
Operador de comparación Significado Ejemplo (devuelve el valor True)
-eq Es igual a 1 -eq 1
-ne Es distinto de 1 -ne 2
-lt Es menor que 1 -lt 2
-le Es menor o igual que 1 -le 2
-gt Es mayor que 2 -gt 1
-ge Es mayor o igual que 2 -ge 1
-like Es como (comparación de caracteres comodín para texto) "file.doc" -like "f*.do?"
-notlike No es como (comparación de caracteres comodín para texto) "file.doc" -notlike "p*.doc"
-contains Contiene 1,2,3 -contains 1
-notcontains No contiene 1,2,3 -notcontains 4
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
Filtrado basado en propiedades de objetos
Dado que $_ hace referencia al objeto de canalización actual, podemos tener acceso a sus propiedades para nuestras pruebas.
A modo de ejemplo, examinemos la clase Win32_SystemDriver de WMI. Puede haber cientos de controladores en un sistema determinado, pero quizá sólo esté interesado en un conjunto específico de controladores del sistema, como los que se están ejecutando actualmente. Si utiliza Get-Member para ver los miembros de Win32_SystemDriver
(Get-WmiObject -Class Win32_SystemDriver | Get-Member -MemberType Property), observará que la propiedad relevante es State y que tiene el valor "Running" cuando el controlador se está ejecutando. Para filtrar los controladores del sistema y seleccionar sólo los que se están ejecutando, escriba:
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"}
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"}
DisplayName : RAS Asynchronous Media Driver
Name : AsyncMac
State : Running
Status : OK
Started : True
DisplayName : Audio Stub Driver
Name : audstub
State : Running
Status : OK
Started : True
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
El comando anterior contiene dos elementos Where-Object, pero se pueden expresar en un solo elemento Where-Object con el operador lógico -and, de esta manera:
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript { ($_.State -eq "Running") -and ($_.StartMode -eq "Manual") } | Format-Table -Property Name,DisplayName
En la siguiente tabla se enumeran los operadores lógicos estándar:
Operador lógico Significado Ejemplo (devuelve el valor True)
-and And lógico; devuelve True si ambos lados son True. (1 -eq 1) -and (2 -eq 2)
-or Or lógico; devuelve True si cualquiera de los lados es True. (1 -eq 1) -or (1 -eq 2)
-not Not lógico; invierte True y False. -not (1 -eq 2)
! Not lógico; invierte True y False. !(1 -eq 2)
Repetir una tarea para varios objetos (ForEach-Object)
El cmdlet ForEach-Object usa bloques de script y el descriptor $_ para el objeto de canalización actual a fin de que pueda ejecutar un comando en cada objeto de la canalización. Esto se puede utilizar para realizar algunas tareas complicadas.
Una situación en la que puede resultar conveniente es cuando se manipulan datos para que sean más útiles. Por ejemplo, se puede usar la clase Win32_LogicalDisk de WMI para devolver información sobre el espacio libre en cada disco local. No obstante, los datos se devuelven en bytes, lo que dificulta su lectura:
PS> Get-WmiObject -Class Win32_LogicalDisk
DeviceID : C:
DriveType : 3
ProviderName :
FreeSpace : 50665070592
Size : 203912880128
VolumeName : Local Disk
Podemos convertir el valor de FreeSpace en megabytes si dividimos cada valor entre 1024 dos veces; tras la primera división, los datos se muestran en kilobytes y, tras la segunda, en megabytes. Puede realizar esto con un bloque de script ForEach-Object:
Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {($_.FreeSpace)/1024,0/1024,0}
48318,01171875
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}
Aparecerá un mensaje de error:
"FreeSpace" es una propiedad de sólo lectura.
En línea:1 carácter:70
+ Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {$_.F <<<< r
eeSpace = ($_.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.
Seleccionar partes de objetos
(Select-Object)
El cmdlet Select-Object permite crear nuevos objetos personalizados de Windows PowerShell que contienen propiedades seleccionadas de los objetos utilizados para crearlos. Para crear un nuevo objeto que incluya sólo las propiedades Name y FreeSpace de la clase Win32_LogicalDisk de WMI, escriba el siguiente comando:
PS> Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace
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
Name MemberType Definition
---- ---------- ----------
Equals Method System.Boolean Equals(Object obj)
GetHashCode Method System.Int32 GetHashCode()
GetType Method System.Type GetType()
ToString Method System.String ToString()
FreeSpace NoteProperty FreeSpace=...
Name NoteProperty System.String Name=C:
Select-Object tiene muchas aplicaciones. Una de ellas es replicar datos para modificarlos posteriormente. Ahora podemos resolver el problema que nos encontramos en la sección anterior. Podemos actualizar el valor de FreeSpace en nuestros objetos recién creados y el resultado incluirá la etiqueta descriptiva:
Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace | ForEach-Object -Process {$_.FreeSpace = ($_.FreeSpace)/1024,0/1024,0; $_}
Name FreeSpace
---- ---------
C: 48317,7265625
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
...
También puede ordenar los objetos en orden inverso especificando el parámetro Descending. Esto invierte el criterio de ordenación de manera que los nombres se ordenan en orden alfabético inverso y los números en orden descendente.
PS> Get-WmiObject -Class Win32_SystemDriver | Sort-Object -Property State,Name -Descending | Format-Table -Property Name,State,Started,DisplayName -AutoSize -Wrap
Name State Started DisplayName
---- ----- ------- -----------
WS2IFSL Stopped False Windows Socket 2.0 Non-IFS Service Provider Supp
ort Environment
wceusbsh Stopped False Windows CE USB Serial Host Driver...
...
wdmaud Running True Microsoft WINMM WDM Audio Compatibility Driver
Wanarp Running True Remote Access IP ARP Driver
...
Usar variables para almacenar objetos
Windows PowerShell trabaja con objetos. Permite crear variables, que son básicamente objetos con nombre, para almacenar los resultados y poder utilizarlos más adelante. Si está acostumbrado a trabajar con variables en otros shells, recuerde que las variables de Windows PowerShell son objetos, no texto.
Las variables se especifican siempre con el carácter inicial $ y pueden contener cualquier carácter alfanumérico o el carácter de subrayado en sus nombres.
Crear una variable
Para crear una variable debe escribir un nombre de variable válido:
PS> $loc
PS>
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
Cuando se escribe este comando, no se muestran resultados porque se envían a $loc. En Windows PowerShell, los resultados mostrados son un efecto secundario: los datos que no se redirigen a alguna ubicación siempre terminan enviándose a la pantalla. Si escribe $loc, se mostrará la ubicación actual:
PS> $loc
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
Name MemberType Definition
---- ---------- ----------
Drive Property System.Management.Automation.PSDriveInfo Drive {get;}
Path Property System.String Path {get;}
Provider Property System.Management.Automation.ProviderInfo Provider {...
ProviderPath Property System.String ProviderPath {get;}
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
Se generará la siguiente solicitud de confirmación:
Confirmar
¿Está seguro de que desea realizar esta acción?
Realizando la operación "Quitar variable" en el destino "Nombre: Error".
Sí
Muchas aplicaciones (incluida la familia de aplicaciones Microsoft Office e Internet Explorer) se pueden automatizar mediante COM. Internet Explorer ilustra algunas de las 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
Este comando inicia Internet Explorer, pero no lo muestra. Si escribe Get-Process, podrá observar que se está ejecutando un proceso llamado iexplore. De hecho, si cierra Windows PowerShell, el proceso seguirá ejecutándose. Deberá reiniciar el equipo o utilizar una herramienta como el Administrador de tareas para finalizar el proceso iexplore.
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 "Application" : "El objeto invocado ha desconectado de sus clientes. (Exception from HRESULT: 0x80010108 (RPC_E_DISCONNECTED))"
En línea:1 carácter:16
+ $ie | Get-Member <<<<
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.
Obtener advertencias acerca de objetos COM contenidos en .NET
En algunos casos, un objeto COM puede tener asociado un contenedor al que se puede llamar en tiempo de ejecución de .NET. Este contenedor se puede utilizar en New-Object. Dado que el comportamiento del contenedor puede ser distinto al del objeto COM normal, New-Object cuenta con un parámetro Strict que le avisa del acceso al contenedor. Si especifica el parámetro Strict y, a continuación, crea un objeto COM que usa un contenedor, aparecerá un mensaje de advertencia:
PS> $xl = New-Object -ComObject Excel.Application -Strict
New-Object : El objeto escrito en la canalización es una instancia del tipo "Mic
rosoft.Office.Interop.Excel.ApplicationClass" del ensamblado de interoperabilidad
primario del componente. Si este tipo expone miembros distintos a los de IDispatch
, los scripts escritos para trabajar con este objeto podrían no funcionar si no
está instalado el ensamblado.
En línea:1 carácter:17
+ $xl = New-Object <<<< -ComObject Excel.Application -Strict
Aunque se crea el objeto, se le avisará de que no es un objeto COM estándar.
Usar clases y métodos estáticos
No todas las clases de .NET Framework se pueden crear con New-Object. Por ejemplo, si intenta crear un objeto System.Environment o System.Math con New-Object, aparecerán estos mensajes de error:
PS> New-Object System.Environment
New-Object : No se encontró el constructor. No se encuentra ningún constructor adecuado para
el tipo System.Environment.
En línea:1 carácter:11
+ New-Object <<<< System.Environment
PS> New-Object System.Math
New-Object : No se encontró el constructor. No se encuentra ningún constructor adecuado para
el tipo System.Math.
En línea:1 carácter:11
+ New-Object <<<< System.Math
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.
Obtener datos de entorno con System.Environment
Normalmente, el primer paso cuando se trabaja con un objeto en Windows PowerShell es utilizar Get-Member para averiguar qué miembros contiene. Con las clases estáticas, el proceso es ligeramente distinto porque la clase no es un objeto.
Hacer referencia a la clase estática System.Environment
Para hacer referencia a una clase estática debe especificar el nombre de la clase entre corchetes. Por ejemplo, puede hacer referencia a System.Environment si escribe el nombre entre corchetes. Al hacerlo, se mostrará información general sobre el tipo:
PS> [System.Environment]
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False Environment System.Object
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
Name MemberType Definition
---- ---------- ----------
Equals Method static System.Boolean Equals(Object ob...
Exit Method static System.Void Exit(Int32 exitCode)
...
CommandLine Property static System.String CommandLine {get;}
CurrentDirectory Property static System.String CurrentDirectory ...
ExitCode Property static System.Int32 ExitCode {get;set;}
HasShutdownStarted Property static System.Boolean HasShutdownStart...
MachineName Property static System.String MachineName {get;}
NewLine Property static System.String NewLine {get;}
OSVersion Property static System.OperatingSystem OSVersio...
ProcessorCount Property static System.Int32 ProcessorCount {get;}
StackTrace Property static System.String StackTrace {get;}
SystemDirectory Property static System.String SystemDirectory {...
TickCount Property static System.Int32 TickCount {get;}
UserDomainName Property static System.String UserDomainName {g...
UserInteractive Property static System.Boolean UserInteractive ...
UserName Property static System.String UserName {get;}
Version Property static System.Version Version {get;}
WorkingSet Property static System.Int64 WorkingSet {get;}
TickCount ExitCode
Ahora puede seleccionar las propiedades de System.Environment que desea ver.
Mostrar las propiedades estáticas de System.Environment
Las propiedades de System.Environment también son estáticas y deben especificarse de forma distinta que las propiedades normales. Utilizamos :: para indicar a Windows PowerShell que queremos usar un método o propiedad estáticos. Para ver el comando que se utilizó para iniciar Windows PowerShell, podemos comprobar el valor de la propiedad CommandLine; para ello, escriba:
PS> [System.Environment]::Commandline
"C:\Archivos de programa\Windows PowerShell\v1.0\powershell.exe"
Para comprobar la versión del sistema operativo debe mostrar el valor de la propiedad OSVersion; para ello, escriba:
PS> [System.Environment]::OSVersion
Platform ServicePack Version VersionString
-------- ----------- ------- -------------
Win32NT Service Pack 2 5.1.2600.131072 Microsoft Window...
Para comprobar si el equipo se está apagando, puede mostrar el valor de la propiedad HasShutdownStarted:
PS> [System.Environment]::HasShutdownStarted
False
Operaciones matemáticas con System.Math
La clase estática System.Math resulta útil para realizar algunas operaciones matemáticas. Los miembros importantes de System.Math son principalmente métodos, que podemos mostrar con Get-Member.
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
Name MemberType Definition
---- ---------- ----------
Abs Method static System.Single Abs(Single value), static Sy...
Acos Method static System.Double Acos(Double d)
Asin Method static System.Double Asin(Double d)
Atan Method static System.Double Atan(Double d)
Atan2 Method static System.Double Atan2(Double y, Double x)
BigMul Method static System.Int64 BigMul(Int32 a, Int32 b)
Ceiling Method static System.Double Ceiling(Double a), static Sy...
Cos Method static System.Double Cos(Double d)
Cosh Method static System.Double Cosh(Double value)
DivRem Method static System.Int32 DivRem(Int32 a, Int32 b, Int3...
Equals Method static System.Boolean Equals(Object objA, Object ...
Exp Method static System.Double Exp(Double d)
Floor Method static System.Double Floor(Double d), static Syst...
IEEERemainder Method static System.Double IEEERemainder(Double x, Doub...
Log Method static System.Double Log(Double d), static System...
Log10 Method static System.Double Log10(Double d)
Max Method static System.SByte Max(SByte val1, SByte val2), ...
Min Method static System.SByte Min(SByte val1, SByte val2), ...
Pow Method static System.Double Pow(Double x, Double y)
ReferenceEquals Method static System.Boolean ReferenceEquals(Object objA...
Round Method static System.Double Round(Double a), static Syst...
Sign Method static System.Int32 Sign(SByte value), static Sys...
Sin Method static System.Double Sin(Double a)
Sinh Method static System.Double Sinh(Double value)
Sqrt Method static System.Double Sqrt(Double d)
Tan Method static System.Double Tan(Double a)
Tanh Method static System.Double Tanh(Double value)
Truncate Method static System.Decimal Truncate(Decimal d), static...
Se muestran varios métodos matemáticos. A continuación se muestra una lista de comandos que demuestran cómo se usan algunos métodos comunes:
PS> [System.Math]::Sqrt(9)
3
PS> [System.Math]::Pow(2,3)
8
PS> [System.Math]::Floor(3.3)
3
PS> [System.Math]::Floor(-3.3)
-4
PS> [System.Math]::Ceiling(3.3)
4
PS> [System.Math]::Ceiling(-3.3)
-3
PS> [System.Math]::Max(2,7)
7
PS> [System.Math]::Min(2,7)
2
PS> [System.Math]::Truncate(9.3)
9
PS> [System.Math]::Truncate(-9.3)
-9
Eliminar objetos de la canalización (Where-Object)
En Windows PowerShell, a menudo se generan y pasan a una canalización más objetos de los deseados. Puede especificar las propiedades de objetos específicos que desee mostrar mediante los cmdlets Format, pero esto no ayuda a quitar objetos completos de la presentación. Quizá desee filtrar objetos antes del final de una canalización, para así poder realizar acciones sólo en un subconjunto de los objetos generados inicialmente.
Windows PowerShell incluye un cmdlet Where-Object que permite probar cada objeto de la canalización y pasarlo por ésta sólo si cumple una determinada condición de prueba. Los objetos que no superen la prueba se quitan de la canalización. La condición de prueba se proporciona como el valor del parámetro Where-ObjectFilterScript.
Realizar pruebas sencillas con Where-Object
El valor de FilterScript es un bloque de script (uno o más comandos de Windows PowerShell especificados entre llaves {}) que se evalúa como True o False. Estos bloques de script pueden ser muy sencillos, pero para crearlos hay que conocer otro concepto de Windows PowerShell: los operadores de comparación. Un operador de este tipo compara los elementos que aparecen a cada lado del mismo. Los operadores de comparación comienzan por un carácter '-' seguido de un nombre. Los operadores de comparación básicos se pueden usar con prácticamente cualquier tipo de objeto, mientras que algunos de los más avanzados sólo pueden utilizarse con texto o matrices.
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:
Operador de comparación Significado Ejemplo (devuelve el valor True)
-eq Es igual a 1 -eq 1
-ne Es distinto de 1 -ne 2
-lt Es menor que 1 -lt 2
-le Es menor o igual que 1 -le 2
-gt Es mayor que 2 -gt 1
-ge Es mayor o igual que 2 -ge 1
-like Es como (comparación de caracteres comodín para texto) "file.doc" -like "f*.do?"
-notlike No es como (comparación de caracteres comodín para texto) "file.doc" -notlike "p*.doc"
-contains Contiene 1,2,3 -contains 1
-notcontains No contiene 1,2,3 -notcontains 4
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
Filtrado basado en propiedades de objetos
Dado que $_ hace referencia al objeto de canalización actual, podemos tener acceso a sus propiedades para nuestras pruebas.
A modo de ejemplo, examinemos la clase Win32_SystemDriver de WMI. Puede haber cientos de controladores en un sistema determinado, pero quizá sólo esté interesado en un conjunto específico de controladores del sistema, como los que se están ejecutando actualmente. Si utiliza Get-Member para ver los miembros de Win32_SystemDriver
(Get-WmiObject -Class Win32_SystemDriver | Get-Member -MemberType Property), observará que la propiedad relevante es State y que tiene el valor "Running" cuando el controlador se está ejecutando. Para filtrar los controladores del sistema y seleccionar sólo los que se están ejecutando, escriba:
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"}
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"}
DisplayName : RAS Asynchronous Media Driver
Name : AsyncMac
State : Running
Status : OK
Started : True
DisplayName : Audio Stub Driver
Name : audstub
State : Running
Status : OK
Started : True
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
El comando anterior contiene dos elementos Where-Object, pero se pueden expresar en un solo elemento Where-Object con el operador lógico -and, de esta manera:
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript { ($_.State -eq "Running") -and ($_.StartMode -eq "Manual") } | Format-Table -Property Name,DisplayName
En la siguiente tabla se enumeran los operadores lógicos estándar:
Operador lógico Significado Ejemplo (devuelve el valor True)
-and And lógico; devuelve True si ambos lados son True. (1 -eq 1) -and (2 -eq 2)
-or Or lógico; devuelve True si cualquiera de los lados es True. (1 -eq 1) -or (1 -eq 2)
-not Not lógico; invierte True y False. -not (1 -eq 2)
! Not lógico; invierte True y False. !(1 -eq 2)
Repetir una tarea para varios objetos (ForEach-Object)
El cmdlet ForEach-Object usa bloques de script y el descriptor $_ para el objeto de canalización actual a fin de que pueda ejecutar un comando en cada objeto de la canalización. Esto se puede utilizar para realizar algunas tareas complicadas.
Una situación en la que puede resultar conveniente es cuando se manipulan datos para que sean más útiles. Por ejemplo, se puede usar la clase Win32_LogicalDisk de WMI para devolver información sobre el espacio libre en cada disco local. No obstante, los datos se devuelven en bytes, lo que dificulta su lectura:
PS> Get-WmiObject -Class Win32_LogicalDisk
DeviceID : C:
DriveType : 3
ProviderName :
FreeSpace : 50665070592
Size : 203912880128
VolumeName : Local Disk
Podemos convertir el valor de FreeSpace en megabytes si dividimos cada valor entre 1024 dos veces; tras la primera división, los datos se muestran en kilobytes y, tras la segunda, en megabytes. Puede realizar esto con un bloque de script ForEach-Object:
Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {($_.FreeSpace)/1024,0/1024,0}
48318,01171875
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}
Aparecerá un mensaje de error:
"FreeSpace" es una propiedad de sólo lectura.
En línea:1 carácter:70
+ Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {$_.F <<<< r
eeSpace = ($_.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.
Seleccionar partes de objetos
(Select-Object)
El cmdlet Select-Object permite crear nuevos objetos personalizados de Windows PowerShell que contienen propiedades seleccionadas de los objetos utilizados para crearlos. Para crear un nuevo objeto que incluya sólo las propiedades Name y FreeSpace de la clase Win32_LogicalDisk de WMI, escriba el siguiente comando:
PS> Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace
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
Name MemberType Definition
---- ---------- ----------
Equals Method System.Boolean Equals(Object obj)
GetHashCode Method System.Int32 GetHashCode()
GetType Method System.Type GetType()
ToString Method System.String ToString()
FreeSpace NoteProperty FreeSpace=...
Name NoteProperty System.String Name=C:
Select-Object tiene muchas aplicaciones. Una de ellas es replicar datos para modificarlos posteriormente. Ahora podemos resolver el problema que nos encontramos en la sección anterior. Podemos actualizar el valor de FreeSpace en nuestros objetos recién creados y el resultado incluirá la etiqueta descriptiva:
Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace | ForEach-Object -Process {$_.FreeSpace = ($_.FreeSpace)/1024,0/1024,0; $_}
Name FreeSpace
---- ---------
C: 48317,7265625
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
...
También puede ordenar los objetos en orden inverso especificando el parámetro Descending. Esto invierte el criterio de ordenación de manera que los nombres se ordenan en orden alfabético inverso y los números en orden descendente.
PS> Get-WmiObject -Class Win32_SystemDriver | Sort-Object -Property State,Name -Descending | Format-Table -Property Name,State,Started,DisplayName -AutoSize -Wrap
Name State Started DisplayName
---- ----- ------- -----------
WS2IFSL Stopped False Windows Socket 2.0 Non-IFS Service Provider Supp
ort Environment
wceusbsh Stopped False Windows CE USB Serial Host Driver...
...
wdmaud Running True Microsoft WINMM WDM Audio Compatibility Driver
Wanarp Running True Remote Access IP ARP Driver
...
Usar variables para almacenar objetos
Windows PowerShell trabaja con objetos. Permite crear variables, que son básicamente objetos con nombre, para almacenar los resultados y poder utilizarlos más adelante. Si está acostumbrado a trabajar con variables en otros shells, recuerde que las variables de Windows PowerShell son objetos, no texto.
Las variables se especifican siempre con el carácter inicial $ y pueden contener cualquier carácter alfanumérico o el carácter de subrayado en sus nombres.
Crear una variable
Para crear una variable debe escribir un nombre de variable válido:
PS> $loc
PS>
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
Cuando se escribe este comando, no se muestran resultados porque se envían a $loc. En Windows PowerShell, los resultados mostrados son un efecto secundario: los datos que no se redirigen a alguna ubicación siempre terminan enviándose a la pantalla. Si escribe $loc, se mostrará la ubicación actual:
PS> $loc
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
Name MemberType Definition
---- ---------- ----------
Drive Property System.Management.Automation.PSDriveInfo Drive {get;}
Path Property System.String Path {get;}
Provider Property System.Management.Automation.ProviderInfo Provider {...
ProviderPath Property System.String ProviderPath {get;}
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
Se generará la siguiente solicitud de confirmación:
Confirmar
¿Está seguro de que desea realizar esta acción?
Realizando la operación "Quitar variable" en el destino "Nombre: Error".
- Sí a todo [N] No [T] No a todo
Suspender [?] Ayuda
(el valor predeterminado es "S"):O
Si después ejecuta el cmdlet Get-Variable, podrá ver las demás variables de Windows PowerShell. Como hay una unidad de Windows PowerShell para las variables, también puede mostrar todas las variables de Windows PowerShell mediante el siguiente comando:
Get-ChildItem variable:
Usar variables de Cmd.exe
Aunque Windows PowerShell no es Cmd.exe, se ejecuta en un entorno de shell de comandos y puede usar las mismas variables disponibles en cualquier entorno de Windows. Estas variables se exponen a través de la unidad env:. Para ver estas variables, escriba:
Get-ChildItem env:
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
También puede crear y modificar variables de entorno en Windows PowerShell. Las variables de entorno a las que se tiene acceso desde Windows PowerShell cumplen las normas habituales para las variables de entorno de cualquier otra ubicación de Windows.
Usar Windows PowerShell para tareas de administración
El objetivo fundamental de Windows PowerShell es proporcionar un control administrativo mejor y más sencillo de los sistemas, de forma interactiva o mediante scripts. En este capítulo se presentan soluciones a muchos problemas específicos de la administración de sistemas Windows con Windows PowerShell. Aunque no hemos hablado de scripts ni funciones en la Guía básica de Windows PowerShell, estas soluciones se pueden aplicar con scripts o funciones más adelante. Mostraremos ejemplos que incluyen funciones como parte de la solución para resolver los problemas.
En la descripción de las soluciones se incluyen combinaciones de soluciones que utilizan cmdlets específicos, el cmdlet general Get-WmiObject e incluso herramientas externas que forman parte de las infraestructuras de Windows y .NET. El uso de herramientas externas constituye un objetivo de diseño a largo plazo de Windows PowerShell. A medida que crezca el sistema, los usuarios seguirán encontrándose con situaciones en las que las herramientas disponibles no hacen todo lo que necesitan que hagan. En lugar de fomentar la dependencia exclusiva de las implementaciones de cmdlets, Windows PowerShell intenta admitir la integración de soluciones de todos los escenarios alternativos posibles.
Administrar procesos locales
Hay únicamente dos cmdlets Process principales: Get-Process y Stop-Process. Puesto que es posible inspeccionar y filtrar procesos utilizando parámetros o los cmdlets Object, puede realizar algunas tareas complejas con sólo estos dos cmdlets.
Mostrar la lista de procesos (Get-Process)
Para obtener una lista de todos los procesos que se ejecutan en el sistema local, ejecute Get-Process sin parámetros.
También puede devolver un único proceso si especifica el Id. del proceso (ProcessId) con el parámetro Id. En el siguiente ejemplo se devuelve el proceso Idle (inactivo) del sistema:
PS> Get-Process -Id 0
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
0 0 0 16 0 0 Idle
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 permite especificar un subconjunto de procesos según el nombre de proceso. Dado que algunos procesos pueden tener el mismo nombre, el resultado puede incluir varios procesos. Si no hay ningún proceso con ese nombre, Get-Process devolverá un error como cuando se especifica un ProcessId. Por ejemplo, si especifica el nombre de proceso explore en lugar de explorer:
PS> Get-Process -Name explore
Get-Process : No se encuentra ningún proceso con el nombre 'explore'.
En línea:1 carácter:12
+ Get-Process <<<< -Name explore
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
Detener procesos (Stop-Process)
Windows PowerShell proporciona flexibilidad a la hora de crear listas de procesos pero, ¿y para detener procesos?
El cmdlet Stop-Process usa un nombre o un Id. para especificar un proceso que se desea detener. La capacidad del usuario para detener procesos depende de los 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
También puede forzar la solicitud de confirmación con el parámetro Confirm. Este parámetro resulta especialmente útil si incluye un carácter comodín al especificar el nombre del proceso, ya que puede buscar por equivocación algunos procesos que no desea detener:
PS> Stop-Process -Name t*,e* -Confirm
Confirmar
¿Está seguro de que desea realizar esta acción?
Realizando la operación "Stop-Process" en el destino "explorer (408)".Sí- Sí a todo [N] No [T] No a todo
Suspender [?] Ayuda
(el valor predeterminado es "S"):n
Confirmar
¿Está seguro de que desea realizar esta acción?
Realizando la operación "Stop-Process" en el destino "taskmgr (4072)".Sí- Sí a todo [N] No [T] No a todo
Suspender [?] Ayuda
(el valor predeterminado es "S"):n
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
- Sí a todo [N] No [T] No a todo
- Sí a todo [N] No [T] No a todo