为Invoke-Command序列化PsObject

时间:2015-09-29 21:46:22

标签: powershell powershell-remoting

我正在寻找使用Invoke-Command将PsObject传递给远程函数的最佳或正确方法。 ConvertTo-Xml适用于序列化,但没有内置的反向cmdlet。我在网上找到的解决方案都是针对特定内容的。

我实现了以下功能,这些功能与我测试的少数对象一起使用,但看起来相当hacky。这会咬我吗?有没有更好但又简单的解决方案?

function Get-TmpFileName () {...}

function Serialize-PsObject($obj) {
    $tmpFile = Get-TmpFileName
    Export-Clixml -InputObject $obj -Path $tmpFile
    $serializedObj = Get-Content $tmpFile
    Remove-Item $tmpFile
    $serializedObj
}

function Deserialize-PsObject($obj) {
    $tmpFile = Get-TmpFileName
    $obj > $tmpFile
    $deserializedObj = Import-Clixml $tmpFile
    Remove-Item $tmpFile
    $deserializedObj
}

2 个答案:

答案 0 :(得分:3)

您是否知道PowerShell已经序列化了通过Invoke-Command发送的对象?

如果由于某种原因不够或不适合您,那么您可以直接使用内置序列化:

$clixml = [System.Management.Automation.PSSerializer]::Serialize($object)
$object = [System.Management.Automation.PSSerializer]::Deserialize($clixml)

.Serialize有一个重载,您可以在其中指定深度(对象内的对象)。

这些与实现Export-ClixmlImport-Clixml时使用的方法相同(但这些cmdlet直接使用文件而不是字符串)。

答案 1 :(得分:1)

您是否尝试过ConvertTo-JSON?