具有开始/处理/结束块的函数中的嵌套函数?

时间:2019-06-14 16:22:27

标签: powershell

在包含begin / process / end块的函数中是否可以有嵌套函数?报告的第一个错误是:

begin : The term 'begin' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if 
a path was included, verify that the path is correct and try again.
At C:\src\cut\f1.ps1:13 char:5
+     begin { Write-Verbose "initialize stuff" }
+     ~~~~~
    + CategoryInfo          : ObjectNotFound: (begin:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

这是有问题的代码。

function f1 (
        [Parameter(Mandatory=$false, ValueFromPipeline=$true)]
        [array]$Content
        ,[Parameter(Mandatory=$false, ValueFromPipeline=$false, Position=0)]
        [string[]]$Path
)
{
    function a([Parameter(Mandatory=$true)][string]$s)
    {
        "=== a === $s"
    }

    begin { Write-Verbose "initialize stuff" }
    process {
        Write-Verbose "process stuff"
        a($Content)
    }
    end { Write-Verbose "end stuff" }
}

Get-Content -Path 'C:\src\cut\cut-man.txt' | f1 -Path '.\cut-man.txt'

该函数可能具有十几个或更多参数。如果无法嵌套该函数,则需要创建另一个函数并重复传递参数或使用全局变量。如果可能,我不想使用全局变量。该怎么办?

1 个答案:

答案 0 :(得分:1)

是的,可以创建嵌套函数,但是您必须坚持函数部分的结构,如下所示:

function ()
{
   param()
   begin{}
   process{}
   end{}
}

您不能在参数,开始,过程和结束部分之间编写任何内容。因此要编写第二个函数,您有两个选择。 1-您可以在第一个函数之外编写第二个函数,它的作用就像魔术一样。 2-如果需要测试嵌套函数的选项,则可以在开始部分或过程部分的开始处编写第二个函数,如下所示:

function f1 (
        [Parameter(Mandatory=$false, ValueFromPipeline=$true)]
        [string]$Content
        ,[Parameter(Mandatory=$false, ValueFromPipeline=$false, Position=0)]
        [string[]]$Path
)
{
    begin 
    { 
        Write-Verbose "initialize stuff" 
        function a([Parameter(Mandatory=$true)][string]$s)
        {
            "=== a === $s"
        }
    }
   process 
    {   
        Write-Verbose "process stuff"
        a($Content)   
    }
    end 
    { 
        Write-Verbose "end stuff" 
    }
}

Get-Content -Path 'C:\src\cut\cut-man.txt' | f1 -Path '.\cut-man.txt'  -Verbose