2012-04-09 13 views
8

Vorrei eseguire un cmdlet e archiviare il valore del risultato in una variabile.Memorizza il valore del risultato di un cmdlet in una variabile in PowerShell

Per esempio

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

Esso elenca le priorità con un colpo di testa. Il primo ad esempio:

Priority 
-------- 
8 

Come posso memorizzarli in una variabile? Ho provato:

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

Ora la variabile è: @{Priority=8} e volevo che fosse 8.

Domanda 2:

Posso memorizzare due variabili con un cmdlet? Intendo, conservalo dopo la pipeline.

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

vorrei evitare questo:

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

risposta

19

utilizzare il flag -ExpandProperty di Select-Object

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

Update per rispondere all'altra domanda:

Si noti che è possibile come bene basta accedere alla proprietà:

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

Quindi, per ottenere più di questi in variabili:

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

è molto utile, grazie – Lgn

+0

potresti dare un'occhiata alla mia domanda 2? – Lgn

+1

@Lgn - Aggiornato. – manojlds

2

Basta accedere alla proprietà Priority dell'oggetto restituito dalla tubazione:

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

(Questo non funziona se Get-WSManInstance restituisce più oggetti.)

Per la seconda domanda: ottenere due proprietà ci sono diverse opzioni, problably il più semplice è quello di avere avere uno variabile * contenente un oggetto con due proprietà distinte:

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

e quindi utilizzare, assumendo un solo processo:

$var.Priority 

e

$var.ProcessID 

Se vi sono più processi $var sarà una matrice che è possibile indice, in modo da ottenere le proprietà del primo processo (usando la sintassi letterale matrice @(...) quindi è sempre una raccolta):

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

e quindi utilizzare:

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

PowerShell utilmente per la linea di comando, ma non così utilmente negli script ha una logica extra quando un ssigning il risultato di una pipeline a una variabile: se non viene restituito alcun oggetto, impostare $null, se viene restituito uno, viene assegnato quell'oggetto, altrimenti viene assegnato un array. Forzare un array restituisce un array con zero, uno o più (rispettivamente) elementi.

Queste modifiche in PowerShell V3 (al momento della scrittura in Release Candidate), utilizzando una proprietà membro su una matrice di oggetti restituiranno una matrice del valore di tali proprietà.

Problemi correlati