Понимание объема функций в рабочем процессе powershell

Скопируйте и вставьте следующее в новую версию Powershell ISE script и нажмите F5:

workflow workflow1{
    "in workflow1"
    func1
}
function func1 {
    "in func1"
    func2
}
function func2 {
    "in func2"
}
workflow1

я получаю ошибку:

Термин func2 не распознается как имя командлета, функции, script файл или операционная программа

Я не понимаю этого. Почему func1 должен быть в области, но не func2? Любая помощь очень ценится. ТИА.

Ответ 1

Подумайте о рабочих процессах как близоруких элементах программирования.

Рабочий процесс не может видеть за пределами того, что сразу доступно в области. Таким образом, вложенные функции не работают с одним рабочим процессом, потому что не могут их видеть.

Исправление состоит в том, чтобы встраивать рабочие процессы вместе с вложенными функциями. Например:

workflow workflow1
{
    function func1 
    {
        "in func1"
        workflow workflow2
        {
            function func2 
            {
                "in func2"
            }
            func2
        }
        "in workflow2"
        workflow2
    }
    "in workflow1"
    func1
}
workflow1

Затем он видит вложенные функции:

in workflow1
in func1
in workflow2
in func2

Подробнее об этом здесь

Ответ 2

На самом деле это не ответ на ваш вопрос, а больше трека. Вложение этого комментария слишком велико.

Из здесь:

Когда вы запускаете рабочий процесс script, Windows PowerShell анализирует scriptв абстрактное синтаксическое дерево (AST). Наличие "рабочего процесса" ключевое слово заставляет компилятор script -to-workflow использовать этот AST для генерировать XAML, формат, необходимый для Windows Workflow Foundation во время выполнения. Чтобы создать пользовательский интерфейс для взаимодействия с этим workflow, мы затем создаем функцию-оболочку, которая имеет тот же параметров, но вместо этого координировать выполнение рабочего процесса внутри исполнительный орган PowerShell Workflow. Вы можете видеть и оболочку функции и сгенерированного XAML, выполнив:

Get-Command workflow1 |Format-List *

Я сделал это для вашего конкретного рабочего процесса (см. рабочий процесс1 в приведенной выше команде), и оба сгенерированного кода XAML и PowerShell... интересны. XAML-код не содержит ссылок на func2, но содержит ссылку на func1.

Ответ 3

Чтобы смутно суммировать все ответы, не задавайте вопросов, почему они ведут себя таким образом, просто согласитесь с тем, что он делает и справляется с этим. Достаточно справедливо.

Я написал целый конвейер развертывания в режиме Powershell без работы, и я бы хотел его оптимизировать, используя рабочий процесс "foreach -parallel", но, похоже, налог на это заключается в том, что мне придется вернуться и перепишите все это в рабочий процесс. Это слишком большой налог, чтобы заплатить, к сожалению, только для того, чтобы получить параллельный цикл foreach.

Извлеченный урок - используйте рабочий процесс Powershell из get-go.

Ответ 4

Вы можете обернуть функции и их вызовы внутри InlineScript, который может быть для каждой системы script. Затем запустите этот inlinescript внутри цикла foreach -Parallel, работающего через системы, которые вы хотите запросить.