Понимание объема функций в рабочем процессе 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, работающего через системы, которые вы хотите запросить.