将cmdlet的结果值存储在Powershell中的变量中

时间:2012-04-09 12:03:26

标签: powershell

我想运行一个cmdlet并将结果的存储在一个变量中。

例如

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

它列出了标题的优先级。第一个例如:

Priority
--------
8

如何将它们存储在变量中?我试过了:

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

现在变量是:@{Priority=8}我希望它是8

问题2:

我可以使用一个cmdlet存储两个变量吗?我的意思是将它存储在管道之后。

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

我想避免这个:

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

2 个答案:

答案 0 :(得分:25)

使用-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

答案 1 :(得分:3)

只需访问从管道返回的对象的Priority属性:

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

(如果Get-WSManInstance返回多个对象,则无效。 2

对于第二个问题:要获得两个属性,有几个选项,可能最简单的是让一个变量*包含一个具有两个独立属性的对象:

$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有助于命令行,但在将管道的结果分配给变量时,脚本中没有那么有用有一些额外的逻辑:如果没有返回任何对象,则设置{{1} },如果返回一个,则分配该对象,否则分配一个数组。强制数组返回一个包含零个,一个或多个(分别)元素的数组。

2 PowerShell V3中的这一变化(在Release Candidate中编写时),使用对象数组上的成员属性将返回这些属性值的数组。