返回远程PowerShell对象

时间:2014-07-02 22:53:13

标签: arrays object powershell invoke-command

我在PoSh中相当缺乏经验,但我认为我可以在noob电路上保持自己的状态。我试图通过PowerShell从SQL表中的服务器列表中检索直接附加存储(DAS)的机制。获取DAS的命令必须从它所连接的服务器本地运行。因为每个服务器都可以连接多个DAS设备,所以我选择为每个服务器创建一个数组,并为每个DAS单元填充一个对象。我已经确定了该过程,并且能够遍历每个服务器并远程运行每个服务器上的命令并捕获我想要的数据(在远程会话中),但是我在获取阵列时遇到了问题从远程会话中退出对象,以便我们可以将此数据写入数据库表。如果我在invoke-command scriptblock中调用数组,一切都很好,我得到了我需要的数据 - 只有在我之后尝试调用它时才会这样。我不打算在每台服务器上建立SQL会话(数百个)来编写数据,因此我更愿意从我运行此服务器的机器上完成。

因为这些数据将直接写入数据库,所以我也更喜欢在同一个脚本中的PowerShell中本地利用它,而不是混淆导出/导入文件,csv等。

我意识到PowerShell会对线路上的对象进行序列化处理,但我的理解是,一旦它返回到本地计算机,它就会重新水化。是我想要完成的事情还是我只是在失去理智?

相关代码是:

    $result = invoke-command -computer $FQDN -credential $mycred -ArgumentList $FQDN -scriptblock {
        param($FQDN)
        $DASArray = @() 
    $OMReport = get-wmiobject -class win32_product | where-object {$_.Name -like 'Dell OpenManage*'}
        if (!$OMReport)
        {
        }
        else
        {

            [xml]$DAS = omreport storage enclosure -fmt xml

            $Nodelist = $DAS.SelectNodes("/OMA/Enclosures/DCStorageObject")
            foreach ($Node in $Nodelist | where-object {($_.SelectSingleNode("EnclosureType").get_InnerXML()) -ne 1})
            {
                $DASValues = New-Object PSObject
                $DASValues | Add-Member –MemberType NoteProperty –Name FQDN –Value $FQDN 
                $DASValues | Add-Member –MemberType NoteProperty –Name ID –Value $Node.selectsinglenode("ObjID").get_InnerXML()
                $DASValues | Add-Member –MemberType NoteProperty –Name Model –Value $Node.selectsinglenode("AssetName").get_InnerXML()
                $DASValues | Add-Member –MemberType NoteProperty –Name EnclosureType –Value $Node.selectsinglenode("EnclosureType").get_InnerXML()
                $DASValues | Add-Member –MemberType NoteProperty –Name ServiceTag –Value $Node.selectsinglenode("ServiceTag").get_InnerXML()

            $DASArray += $DASValues

            }
         }

     } 
$result
if (!$DASArray)
{
}
else
{
$DASArray
}                   
}

从scriptblock中调用时的一些示例输出:

FQDN               : server1
ID                 : 16777237
Model              : MD1200
EnclosureType      : 7
ServiceTag         : XXXXX1   
PSComputerName     : server1
RunspaceId         : 999231e0-5be1-4b8b-8cf1-6462a9fccad3
PSShowComputerName : True

FQDN               : server1
ID                 : 16777238
Model              : MD1200
EnclosureType      : 7
ServiceTag         : XXXXX2   
PSComputerName     : server1
RunspaceId         : 999231e0-5be1-4b8b-8cf1-6462a9fccad3
PSShowComputerName : True

FQDN               : server1
ID                 : 16777239
Model              : MD1200
EnclosureType      : 7
ServiceTag         : XXXXX3   
PSComputerName     : server1
RunspaceId         : 999231e0-5be1-4b8b-8cf1-6462a9fccad3
PSShowComputerName : True

FQDN               : server2
ID                 : 16777240
Model              : MD1200
EnclosureType      : 7
ServiceTag         : XXXXXX4  
PSComputerName     : server2
RunspaceId         : 999231e0-5be1-4b8b-8cf1-6462a9fccad3
PSShowComputerName : True

有什么想法吗?

0 个答案:

没有答案