Вложенная функция внутри функции с блоками начала / процесса / конца? - PullRequest
0 голосов
/ 14 июня 2019

Возможно ли иметь вложенную функцию внутри функции, содержащей блоки 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 Ответ

1 голос
/ 14 июня 2019

Да, можно создать вложенную функцию, но вы должны придерживаться структуры раздела функции, которая выглядит следующим образом:

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

вы не можете записывать что-либо между разделами 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...