为 Invoke-Command 序列化 PsObject

bob*_*bob 2 powershell powershell-remoting

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

我实现了以下函数,这些函数适用于我测试的几个对象,但看起来相当老套。这是要咬我吗?有没有更好但仍然简单的解决方案?

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
}
Run Code Online (Sandbox Code Playgroud)

bri*_*ist 6

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

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

$clixml = [System.Management.Automation.PSSerializer]::Serialize($object)
$object = [System.Management.Automation.PSSerializer]::Deserialize($clixml)
Run Code Online (Sandbox Code Playgroud)

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

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