powershell - PowerShell | Get-ChildItem 通过管道不提供所有项目的功能
问题描述
由于 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 中的高级函数具有三个不同的块:
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)"
}
}
}
推荐阅读
- java - AS 4.2.1 中的 R.java 文件在哪里?
- asp.net - Xero 删除连接
- c# - 在 asp.net 中同时选择了三个单选按钮
- css - materialui工具提示右侧的CSS三角形
- machine-learning - 如何使用 cosine_similarity 运行 KNN?
- r - 如何使用'tables'包将data.frame写入R中的PDF表格?
- python - python烧瓶中的图标
- javascript - 函数在 Firebase 中创建新的用户身份验证,但不会在用户集合中创建相应的文档
- python - 在本网站上的某个人的帮助下,我使用 KivyMD 在 Python 中制作了按钮。这对他来说非常有效,但对我来说有问题
- html - 如何使用 display flex 实现这种设计?