【问题标题】:PowerShell | Get-ChildItem to Function via Pipeline not providing all itemsPowerShell | Get-ChildItem 通过管道不提供所有项目的功能
【发布时间】:2020-05-29 23:16:57
【问题描述】:

由于 Azure Dev Ops 在部署时将 LF 转换为 CRLF,我必须创建一个自定义函数来搜索 .sh 文件并将它们转换回它们在 repo (LF) 中的存储方式。该代码我很好,但是我真的想制作一个很棒的函数,我可以执行一个 get-childitem 递归查找 .sh 文件,然后将其传递给我的自定义函数,该函数会将它们恢复为正确的格式。

我的问题是我、get-childitem 和函数无法相处。

为了让本文只关注主要问题,这里有一个过于简单的示例函数:

Function List-Items {
    param (
        [Parameter(ValueFromPipeline = $true)]$items
    )

    Write-Output "Item Count: $($items | Measure-Object | select -ExpandProperty Count)"
    foreach ($item in $items) {
        Write-Output "Item: $($item)"
    }
}

我称之为:

dir c:\temp\ | List-Items

即使通过此命令显然有 52 个项目: dir c:\temp\ | Measure-Object

该函数只查看这 52 条记录中的最后一条记录。如何在我的自定义列表项函数中访问所有 52 条记录?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    这是预期的行为。实际上,PowerShell 中的advanced function 具有three distinct blocks

    • begin - 在管道开始执行之前运行一次
    • process - 为每个管道绑定输入项运行一次
    • end - 上游 cmdlet 完成发送输入后运行一次

    当您没有指定任何这些不同的块,而只有一个函数体时,例如您的示例:

    Function List-Items {
        param (
            [Parameter(ValueFromPipeline = $true)]$items
        )
    
        # Do stuff with $items
    
    }
    

    其实相当于:

    Function List-Items {
        param (
            [Parameter(ValueFromPipeline = $true)]$items
        )
    
        end {
            # Do stuff with $items
        }
    }
    

    换句话说,函数体默认充当end 块,这就是为什么您只看到绑定到$items 的最后一个值。

    要解决此问题,请明确指定 process 块:

    Function List-Items {
        param (
            [Parameter(ValueFromPipeline = $true)]$items
        )
    
        process {
            foreach ($item in $items) {
                Write-Output "Item: $($item)"
            }
        }
    }
    

    【讨论】:

    • 非常感谢!现在看起来很简单,但我确实在谷歌上搜索了一段时间,而我使用的关键字并没有让我接近需要适当的功能结构。代码有效!
    • @EricWeintraub 不客气!是的,如果您不知道要搜索哪些术语,肯定很难发现。 about_* 帮助文件几乎总是是最好的起点!
    【解决方案2】:

    您需要一个进程块,为每个管道项目运行一次。

    function hi { 
      param([Parameter(ValueFromPipeline=$True)]$inputvalue)
    
      process { 
        $inputvalue.count 
      } 
    
    }
    
    1,2,3 | hi
    
    1
    1
    1
    
    

    【讨论】:

      猜你喜欢
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多