21

我想运行一个 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
4

2 回答 2

34

使用-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
于 2012-04-09T12:44:32.087 回答
4

只需访问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 对命令行很有帮助,但在脚本中没有那么有用 在将管道的结果分配给变量时有一些额外的逻辑:如果没有返回对象,则设置$null,如果返回,则分配该对象,否则为数组被安排了。强制数组返回一个包含零个、一个或多个(分别)元素的数组。

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

于 2012-04-09T13:41:02.930 回答