【问题标题】:Serializing PsObject for Invoke-Command为 Invoke-Command 序列化 PsObject
【发布时间】:2015-09-29 21:46:21
【问题描述】:

我正在寻找使用 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
}

【问题讨论】:

  • 如果你有 PSv3+,你可以使用 $Using.在 PowerShell 3.0 中,以 $using: 为前缀的变量会被自动识别为本地变量并发送到远程计算机。

标签: powershell powershell-remoting


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我尝试通过 Invoke-Command 传递 PsObject,但它似乎没有在远程端正确反序列化。我今天会再试一次,然后用问题症状编辑我的问题。谢谢。
  • 我在将脚本块发送到服务器之前弄乱了它。现在它就像我最初预期的那样工作。我仍然喜欢您可以在必要时手动序列化而无需进入文件系统。谢谢!
  • 这正是我在从 Invoke-Command 返回的对象没有被足够序列化的情况下所需要的。 Wish Invoke-Command 内置了一个深度选项。:)
【解决方案2】:

你试过ConvertTo-JSON?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2018-11-20
    • 2020-06-30
    • 2022-12-02
    • 2021-02-24
    相关资源
    最近更新 更多