0

我正在尝试使 Powershell 模块与外部 API 一起使用。我有一个看起来像这样的自定义对象:

$Subscriber = New-Module -AsCustomObject -ScriptBlock {
    [string] $EmailAddress=$null
    [string] $Name=$null
    [bool]   $Resubscribe=$false
    [bool]   $RestartSubscriptionBasedAutoresponders=$false

    Export-ModuleMember -Variable * -Function *
}

现在,我希望这个对象能够实现一个以 JSON 格式输出自身的函数。我知道这样做的正常方法是:$Subscriber | ConvertTo-Json但相反,我希望这个对象按照这些思路实现一些东西:

$Subscriber = New-Module -AsCustomObject -ScriptBlock {
    [string] $EmailAddress=$null
    [string] $Name=$null
    [bool]   $Resubscribe=$false
    [bool]   $RestartSubscriptionBasedAutoresponders=$false

    Function ToJson {
        $this | ConvertTo-Json
    }

    Export-ModuleMember -Variable * -Function *
}

但我的问题是没有 $this 变量,我也无法找到有关任何其他方法的任何信息。我是否只是试图将 Powershell 滥用到根本不支持的程度?还是我只是错过了一些明显的东西?我愿意接受任何批评和建议:)

4

2 回答 2

1

我没有广泛测试它,试一试。它评估$^自动变量,该变量包含会话收到的最后一行中的第一个标记(变量名称)。

function ToJson { Invoke-Expression "$^" | ConvertTo-Json }
于 2013-05-14T09:51:20.887 回答
0

您在模块范围内定义的变量(例如$EmailAddress)可以从模块中定义的内部函数访问1 。

但是ConvertTo-Json从管道转换单个对象。

因此,您最好定义一个对象,并将其传递给:

$Subscriber = New-Module -AsCustomObject -ScriptBlock {
    $data = New-Object PSObject -Property @{
              EmailAddress=$null;
              Name=$null;
              Resubscribe=$false;
              RestartSubscriptionBasedAutoresponders=$false
            }

    Function ToJson {
        $data | ConvertTo-Json
    }

    Export-ModuleMember -Variable * -Function *
}

但这并不能真正解决-AsCustomObject,因此可以在内部完成对单个对象的转换ToJson

$Subscriber = New-Module -AsCustomObject -ScriptBlock {
    [string] $EmailAddress=$null
    [string] $Name=$null
    [bool]   $Resubscribe=$false
    [bool]   $RestartSubscriptionBasedAutoresponders=$false

    Function ToJson {
        New-Object PSObject -Property @{
              EmailAddress=$EmailAddress;
              Name=$Name;
              Resubscribe=$Resubscribe;
              RestartSubscriptionBasedAutoresponders=$RestartSubscriptionBasedAutoresponders
            } | ConvertTo-Json
    }

    Export-ModuleMember -Variable * -Function *
}

(而且,据我所知,$this在这种情况下没有单一的:当然没有.psm1类型模块。)


1如果您使用script:范围前缀,则更新。

于 2013-05-14T09:48:05.043 回答