我想运行一个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
答案 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中编写时),使用对象数组上的成员属性将返回这些属性值的数组。