我有一段时间似乎是一个完全奇怪的问题。我基本上试图通过WinRM和Invoke-Command
PowerShell cmdlet来清点一堆工作站,但是当我尝试一次执行多个Get-WMIObject
调用时,我会感到很悲伤。
在这种情况下,我特意尝试获取工作站的型号和序列号并将它们输出到CSV,这使得两个命令在同一个Scriptblock中执行很重要,这给了我一些非常类似的东西。以下,基本上。
Invoke-Command -ScriptBlock { Get-WmiObject Win32_ComputerSystem | Select Model ; Get-WmiObject win32_SystemEnclosure | Select serialnumber } -ComputerName (Get-ADComputer -Server [domain I care about] -filter 'name -Like "[types of computers I care about]"' | Select-Object -expand Name)
即使在本地运行,Get-WmiObject Win32_ComputerSystem | Select Model ; Get-WmiObject win32_SystemEnclosure | Select serialnumber
也只返回第一个命令。我已经尝试过交换它们并执行第一个命令,而第二个命令不执行。我的一些同事报告说,它对他们来说效果很好,其他人看到与我相同的结果,并且它似乎不是版本问题,因为其工作的人之一是运行相同版本的PowerShell。我是。 (5.0.10240.16384)
以下是一些不同命令组合的屏幕截图。任何人都知道这里发生了什么?
答案 0 :(得分:2)
如果您更改select-object cmdlet中的列表,以便两者都包含每个输出的属性,您将获得所需的结果(我认为)。
Invoke-Command -ScriptBlock { Get-WmiObject Win32_ComputerSystem | Select Model,SerialNumber ; Get-WmiObject win32_SystemEnclosure | Select model,serialnumber } -ComputerName localhost
这将使您输出到应包含所有信息的屏幕。如果你只是想要对象,你可以捕获输出并看到所有属性都存在。
$objects=Invoke-Command -ScriptBlock { Get-WmiObject Win32_ComputerSystem | Select Model ; Get-WmiObject win32_SystemEnclosure | Select serialnumber } -ComputerName (Get-ADComputer -Server [domain I care about] -filter 'name -Like "[types of computers I care about]"' | Select-Object -expand Name)
如果您execute $objects | format-list *
,您会看到有两个对象,一个是模型,一个是序列号。
将不同的对象输出到单个CSV是另一个问题。您会根据 first 对象中的属性获取CSV中的列,因此您将丢失CSV中的SerialNumber属性。