2012-04-09 36 views
8

Me gustaría ejecutar un cmdlet y almacenar el valor de del resultado en una variable.Almacenar el valor del resultado de un cmdlet en una variable en Powershell

Por ejemplo

C:\PS>Get-WSManInstance -enumerate wmicimv2/win32_process | select Priority 

enumera prioridades con una cabecera. El primero, por ejemplo:

Priority 
-------- 
8 

¿Cómo puedo almacenarlos en una variable? He intentado:

$var=Get-WSManInstance -enumerate wmicimv2/win32_process | select Priority 

Ahora la variable es: @{Priority=8} y yo quería que fuera 8.

Pregunta 2:

puedo almacenar dos variables con un cmdlet? Me refiero a almacenarlo después de la tubería.

C:\PS>Get-WSManInstance -enumerate wmicimv2/win32_process | select Priority, ProcessID 

me gustaría evitar esto:

$prio=Get-WSManInstance -enumerate wmicimv2/win32_process | select Priority 
$pid=Get-WSManInstance -enumerate wmicimv2/win32_process | select ProcessID 

Respuesta

19

usar la bandera -ExpandProperty de Select-Object

$var=Get-WSManInstance -enumerate wmicimv2/win32_process | select -expand Priority 

actualización para responder a la otra pregunta:

Tenga en cuenta que al igual que así solo acceda a la propiedad:

$var=(Get-WSManInstance -enumerate wmicimv2/win32_process).Priority 

Así que para obtener varias de ellas en variables:

$var=Get-WSManInstance -enumerate wmicimv2/win32_process 
    $prio = $var.Priority 
    $pid = $var.ProcessID 
+0

es muy útil, gracias – Lgn

+0

¿podría echar un vistazo a mi pregunta 2? – Lgn

+1

@Lgn - Actualizado. – manojlds

2

Sólo acceder a la propiedad Priority del objeto devuelto de la tubería:

$var = (Get-WSManInstance -enumerate wmicimv2/win32_process).Priority 

(Esto no funcionará si Get-WSManInstance devuelve múltiples objetos.)

Para la segunda pregunta: para obtener dos propiedades hay varias opciones, problably el más simple es tener tener uno variables * que contiene un objeto con dos edificios independientes:

$var = (Get-WSManInstance -enumerate wmicimv2/win32_process | select -first 1 Priority, ProcessID) 

y a continuación, utilizar, asumiendo un único proceso:

$var.Priority 

y

$var.ProcessID 

Si hay varios procesos $var será una matriz que puede índice, así que para obtener las propiedades del primer proceso (utilizando la sintaxis literal de Array @(...) por lo que siempre es una colección):

$var = @(Get-WSManInstance -enumerate wmicimv2/win32_process | select -first 1 Priority, ProcessID) 

y luego usar:

$var[0].Priority 
$var[0].ProcessID 

PowerShell amablemente para la línea de comandos, pero no tan amablemente en secuencias de comandos tiene cierta lógica adicional cuando una indicando el resultado de una tubería a una variable: si no se devuelven los objetos, configure $null, si se devuelve uno, se asignará ese objeto; de lo contrario, se asignará una matriz. Forzar una matriz devuelve una matriz con cero, uno o más elementos (respectivamente).

Esto cambia en PowerShell V3 (al momento de escribir en Release Candidate), el uso de una propiedad miembro en una matriz de objetos devolverá una matriz del valor de esas propiedades.

Cuestiones relacionadas