【问题标题】:Custom PowerShell Snapin: custom format doesn't work自定义 PowerShell 管理单元:自定义格式不起作用
【发布时间】:2011-03-22 18:08:29
【问题描述】:

我使用this article 编写了我自己的第一个 Powershell Cmdlet 和 Snapin。而且效果很好。

但是我从我自己的数据类中返回了一组对象,它有四个属性,我希望 Powershell 默认只显示其中一个属性。所以我用this part of the article创建了这个格式文件:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
    <ViewDefinitions>
        <View>
            <Name>RemoteFile</Name>
            <ViewSelectedBy>
                <TypeName>MyFullNamespace.RemoteFileData</TypeName>
            </ViewSelectedBy>
            <TableControl>
                <TableHeaders>
                    <TableColumnHeader />
                </TableHeaders>
                <TableRowEntries>
                    <TableRowEntry>
                        <TableColumnItems>
                            <TableColumnItem>
                                <PropertyName>Filename</PropertyName>
                            </TableColumnItem>
                        </TableColumnItems>
                    </TableRowEntry>
                </TableRowEntries>
            </TableControl>
        </View>
    </ViewDefinitions>
</Configuration>

并将其链接到 Snapin:

    public override string[] Formats
    {
        get { return new string[] { "MyFormatFilename.ps1xml" }; }
    }

但是当我使用 installutil 安装 Snapin,使用 Add-PSSnapin 并调用我的 Cmdlet 时,会显示对象的所有属性。

我做错了什么?

【问题讨论】:

  • 以防万一:您是否知道管理单元是一种过时的方法,而首选(实际上更简单)的方法是模块?我创建了许多添加了任何类型的自定义格式的模块,并且从未遇到过问题。注:这绝不是您问题的答案,但也许您仍然想尝试模块,而不是管理单元。
  • @Roman 不,我不知道。你有模块教程的链接吗?为什么 snapins 过时了?微软在其 SharePoint 2010 Cmdlet 中使用了一个……对我来说听起来并不那么古老……
  • 插件方法并没有那么古老或过时,但他们只是发明了一种更好的方法——模块。为什么更好?仅仅因为它们更易于开发、配置和部署(xcopy 安装)。这是 MSDN 链接:msdn.microsoft.com/en-us/library/dd878310(VS.85).aspx
  • 我去看看,谢谢!
  • @hinek:管理单元是 powershell v1 的唯一选择; sp2010 的人想要 v1 兼容性。模块仅适用于 powershell v2(默认在 windows 7、2008r2 上 - 但 v2 也可以安装在 xp/vista/2003 上)

标签: c# powershell powershell-2.0 pssnapin


【解决方案1】:

一切看起来都是正确的,只是我不确定在没有定义列标题标签的情况下它的行为方式。尝试添加这个节点而不是你的空节点:

<TableColumnHeader>
  <Label>FileName</Label>
</TableColumnHeader>

当通过 Add-PSSnapin 加载文件时,还要确保文件 MyFormatFilename.ps1xml 与管理单元位于同一目录中。此外,可能是废话,但请仔细检查 &lt;TypeName&gt; 元素中指定的类型名称中的拼写错误。

更新:我尝试了上面列出的 XML,它对我有用。我将它复制到 Notepad2 并保存到 C:\temp\test.ps1xml 然后执行:

1# $obj = new-object psobject
2# $obj.psobject.TypeNames.Insert(0, 'MyFullNamespace.RemoteFileData')
3# Add-Member -InputObject $obj -MemberType NoteProperty -Name Filename `
              -Value 'some-remotefile.txt'
4# Add-Member -InputObject $obj -MemberType NoteProperty -Name Dummy `
              -Value 'dummy prop'
5# $obj.psobject.TypeNames
MyFullNamespace.RemoteFileData
System.Management.Automation.PSCustomObject
System.Object
6# $obj

Filename                                                    Dummy
--------                                                    -----
some-remotefile.txt                                         dummy prop


7# Update-FormatData C:\temp\test.ps1xml
8# $obj

Filename
--------
some-remotefile.txt

我会仔细检查完整的类型名instance.GetType().FullName 并仔细检查格式文件的内容。确保它与您注册管理单元的目录相同。

【讨论】:

  • 我在有和没有
  • 嗨 Keith,TypeName 是显示数据的类型,对吧?因此,如果我通过执行 WriteObject(new RemoteFileData(...)); 在我的 cmdlet 中返回数据TypeName 必须是 RemoteFileData 的命名空间和名称,对吧?
  • 是的,没错。加载管理单元后,对您的类型执行 Get-FormatData -TypeName &lt;full type name&gt; 并查看它是否将其转换为格式数据。此外,通过 Get-Member 运行 cmdlet 的输出并仔细检查完整的类型名。
  • 有趣的事情:当我尝试你的建议时(顺便谢谢你),我发现,当我只调用我的 cmdlet 时,我得到了正确格式的输出。但是,如果我先调用“Get-Help My-Cmdlet”然后调用 My-Cmdlet,它仍然会返回输出而不遵循我的观点......疯了!?
  • 是的,这太疯狂了。如果您先调用Get-Help My-Cmdlet,然后再调用Get-FormatData -Type &lt;full type name&gt;,您的格式数据还会显示吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 2013-05-04
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多