在包含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'
该函数可能具有十几个或更多参数。如果无法嵌套该函数,则需要创建另一个函数并重复传递参数或使用全局变量。如果可能,我不想使用全局变量。该怎么办?
答案 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