【问题标题】:Getting original object after piping via Out-GridView通过 Out-GridView 管道后获取原始对象
【发布时间】:2020-03-09 06:36:56
【问题描述】:

我需要显示文件名列表不带路径并打开所选文件。

我可以让它与完整路径一起工作:

Get-ChildItem *.txt -Recurse | Sort-Object Name| Out-GridView -PassThru | Invoke-Item

但是当我尝试只显示文件名时它失败了:

Get-ChildItem *.txt -Recurse | Sort-Object Name| Select-Object Name | Out-GridView -PassThru | Invoke-Item

通过 Get-Member 进行管道传输,我了解到Select-Object Name 将所有非名称属性都删除了。那么如何从 GridView 中获取原始文件对象呢?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您可能希望为此使用隐藏的PSStandardMembers 集的DefaultDisplayPropertySet 属性:

    $defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet',[string[]]@('Name'))
    $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet)
    
    Get-ChildItem *.txt -Recurse | Select-Object * |
    ForEach-Object {
        $_ | Add-Member MemberSet PSStandardMembers $PSStandardMembers; $_
    } | Out-Gridview -PassThru | Select-Object FullName
    
    • Get-ChildItem *.txt 具有以下默认显示属性集:LastWriteTimeLengthName
    • Select-Object * 剥离完整的属性集(显示所有属性)
    • Add-Member MemberSet PSStandardMembers $PSStandardMembers 添加了一个新的 display 集,其中仅包含 Name 属性,其余属性隐藏
    • Select-Object FullName 揭示了隐藏的 FullName 属性

    【讨论】:

      【解决方案2】:

      问题是,Invoke-Item 需要路径而不仅仅是文件名。 您可以将 get-childitem 存储在临时变量中:

      $tmp = Get-ChildItem *.txt -Recurse | Sort-Object Name
      $tmp | Select-Object Name | Out-GridView -PassThru
      $tmp | Invoke-Item
      

      这就是你想要的吗?请让我知道它是否有效,如果有效,请将我的帖子标记为答案。 :)

      【讨论】:

        猜你喜欢
        • 2018-06-17
        • 2014-04-13
        • 2017-12-19
        • 2014-09-25
        • 1970-01-01
        • 2021-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多