从PowerShell cmdlet返回一个对象

9

我想为PowerShell snapin创建自己的cmdlet集合。遇到的问题是,我创建了自己的对象并在ProcessRecord方法中创建和填充它,但无法更改返回类型从而使我能够返回我创建的对象。

 protected override void ProcessRecord()
 {
    ReportFileSettings rptFileSettings = new ReportFileSettings();
    rptFileSettings.Enabled = string.Equals((reader.GetAttribute("Enabled").ToString().ToLower()), "yes");
    rptFileSettings.FileLocation = reader.GetAttribute("FileLocation").ToString();
    rptFileSettings.OverwriteExisting = string.Equals(reader.GetAttribute("OverwriteExistingFile").ToString().ToLower(), "yes");
    rptFileSettings.NoOfDaysToKeep = int.Parse(reader.GetAttribute("NumberOfDaysToKeep").ToString());
    rptFileSettings.ArchiveFileLocation = reader.GetAttribute("ArchiveFileLocation").ToString();

    return rptFileSettings;
 }

这是我的ProcessRecord方法,但由于它重写了来自PSCmdlet的方法,所以我无法更改返回类型为void。
有人能帮忙找出最好的方式来返回rptFileSettings对象,以便我可以在其他cmdlet中使用它的值吗?

你为什么想要从ProcessRecord方法中返回任何内容呢?它有一个非常特定的目的,在cmdlet处理生命周期中没有返回值的用途。 - famousgarkin
我对PowerShell和创建PowerShell cmdlets都很陌生,因此我正在尝试边学边做。不幸的是,我的学习过程并不顺利。 - user1865044
我明白了。如果你只想将创建的对象传递到管道以输出或传递给其他命令进行处理,那么可以使用 Cmdlet.WriteObject 方法来完成。在你的情况下,应该使用 WriteObject(rptFileSettings); - famousgarkin
1个回答

11

您不需要从Cmdlet.ProcessRecord方法返回值。该方法在PowerShell cmdlet处理生命周期中有其特定的位置和用法。

将对象沿着cmdlet处理管道传递由框架自动处理。就像您的cmdlet实例获取输入数据一样,它可以将数据发送到输出以进行进一步处理。使用输入处理方法,即BeginProcessingProcessRecordEndProcessing中的Cmdlet.WriteObject方法来将对象传递到输出。

要将构造的rptFileSettings对象传递给cmdlet输出,您只需要执行此操作:

protected override void ProcessRecord()
{
    ReportFileSettings rptFileSettings = new ReportFileSettings();
    ...
    WriteObject(rptFileSettings);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接