Сохраните значение результата командлета в переменной в Powershell

Я хотел бы запустить командлет и сохранить результатыvalue в переменной.

Например

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

В нем перечислены приоритеты с заголовком. Первый например:

<code>Priority
--------
8
</code>

Как я могу хранить их в переменной? Я пробовал:

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

Теперь переменная:@{Priority=8} и я хотел, чтобы это было8.

Вопрос 2:

Могу ли я хранить две переменные с одним командлетом? Я имею в виду хранить его после конвейера.

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

Я хотел бы избежать этого:

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

Ответы на вопрос(2)

Priority Свойство объекта, возвращаемого из конвейера:

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

(Это не сработает, еслиGet-WSManInstance возвращает несколько объектов.2)

По второму вопросу: чтобы получить два свойства, есть несколько вариантов, вероятно, самый простой - иметьone переменная *, содержащая объект с двумя отдельными свойствами:

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

и затем использовать, предполагая только один процесс:

$var.Priority

а также

$var.ProcessID

Если есть несколько процессов$var будет массив, который вы можете индексировать, чтобы получить свойства первого процесса (используя синтаксис литерала массива@(...) так что это всегда коллекция1):

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

а затем используйте:

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

1 PowerShell полезно для командной строки, но не так полезно в сценариях, имеет некоторую дополнительную логику при назначении результата конвейера для переменной: если не возвращаются никакие объекты, тогда устанавливается$nullЕсли возвращается один, то этот объект назначается, в противном случае назначается массив. Форсирование массива возвращает массив с нулем, одним или несколькими (соответственно) элементами.

2 Это изменяется в PowerShell V3 (на момент написания в Release Candidate), при использовании свойства-члена в массиве объектов возвращается массив значений этих свойств.

Решение Вопроса

-ExpandProperty флагSelect-Object

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

Обновление, чтобы ответить на другой вопрос:

Обратите внимание, что вы также можете просто получить доступ к свойству:

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

Итак, чтобы получить несколько из них в переменные:

$var=Get-WSManInstance -enumerate wmicimv2/win32_process
   $prio = $var.Priority
   $pid = $var.ProcessID
 09 апр. 2012 г., 15:49
@Lgn - Обновлено.
 17 июн. 2012 г., 11:26
В PowerShell v3 вы можете сделать(Get-WSManInstance -enumerate wmicimv2/win32_process).Priority & # X2013; очень хорошо :)
 Lgn09 апр. 2012 г., 14:53
это очень полезно, спасибо
 Lgn09 апр. 2012 г., 15:27
не могли бы вы взглянуть на мой вопрос 2?

Ваш ответ на вопрос