gpt4 book ai didi

function - 管道获取内容到自己的功能

转载 作者:行者123 更新时间:2023-12-04 15:45:24 25 4
gpt4 key购买 nike

我正在尝试编写一个 powershell 函数,该函数通过流水线从 get-content commandlet 接收文件列表并处理它们。管道看起来像这样:

get-content D:\filelist.txt | test-pipeline

为简单起见,下面的函数应该只显示文本文件的每一行。

function test-pipeline
{
<#
.Synopsis
#>

[CmdletBinding( SupportsShouldProcess=$true)]

Param([Parameter(Mandatory = $true,
ValueFromPipeLine = $true)]
[array]$filelist

)



foreach ($item in $filelist)
{
$item
}


}

我的文件列表是一个普通的 .txt 文件,看起来像这样。

line 1
line 2
line 3
line 4
line 5

无论我将什么类型的参数传递给函数,它都不会起作用,并且只会在 $filelist 变量中显示文本文件的最后一行。有人可以帮忙吗? Powershell 版本是 v2提前致谢

最佳答案

您只看到最后一行的原因需要深入了解可使用管道的 PowerShell 函数的本质。在没有 Swonkie 提到的显式 begin/process/end block 的情况下,函数中的所有代码都像在 end block 中一样运行,即就像你写的一样:

function test-pipeline
{
[CmdletBinding()]
Param(
[Parameter(ValueFromPipeLine = $true)][array]$filelist
)
END {
$filelist
}
}

但是 $filelist 是一个管道变量,在输入管道数据时只有 current 值; end block 在管道输入耗尽时运行,因此 $filelist 仅包含最后一个值。只需将 end block 更改为 process block ——它针对管道中的每个值运行,将为您提供所需的输出:

function test-pipeline
{
[CmdletBinding()]
Param(
[Parameter(ValueFromPipeLine = $true)][array]$filelist
)
PROCESS {
$filelist
}
}

请注意,您在那里不需要任何类型的循环——管道已经提供了“循环”。


这只是处理管道数据的几种方法之一。这是一个紧密的变体,它更短一些:使用 filter 而不是 function,因为没有显式 block 的 filter 就像所有代码一样运行在 process block 中。

filter test-pipeline
{
[CmdletBinding()]
Param(
[Parameter(ValueFromPipeLine = $true)][array]$filelist
)
$filelist
}

要进一步深入研究为流水线编写函数的迷人而神秘的世界,请查看我写的深入分析,Down the Rabbit Hole: A Study in PowerShell Pipelines, Functions, and Parameters ,发表在 Simple-Talk.com 上。享受您的 PowerShell 冒险吧!

关于function - 管道获取内容到自己的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26944389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com