您可以将函数和函数调用移动到工作流内的 InlineScript (PowerShell ScriptBlock),如下所示 .
workflow test {
InlineScript
{
function func1{
Write-Output "Func 1"
logMessage
}
function logMessage{
Write-Output "logMessage"
}
func1
}
}
输出:
Func 1
logMessage
正如@JeffZeitlin在他的回答中提到的,工作流程不是PowerShell,而是更具限制性 . InlineScript块允许解释普通的PowerShell代码,但范围将与InlineScript块相关联 . 例如,如果您在脚本块中定义函数然后尝试在InlineScript块之外调用 func1 函数(但仍在工作流中),则它将失败,因为它超出了范围 .
如果您在工作流程之外或工作流程内部而不是在InlineScript块中定义两个函数,则会发生相同的情况 .
现在举例说明如何将其应用于运行 foreach -parallel 循环 .
workflow test {
## workflow parameter
param($MyList)
## parallel foreach loop on workflow parameter
foreach -parallel ($Item in $MyList)
{
## inlinescript
inlinescript
{
## function func1 declaration
function func1{
param($MyItem)
Write-Output ('Func 1, MyItem {0}' -f $MyItem)
logMessage $MyItem
}
## function logMessage declaration
function logMessage{
param($MyItem)
Write-Output ('logMessage, MyItem: {0}' -f $MyItem)
}
## func1 call with $Using:Item statement
## $Using: prefix allows us to call items that are in the workflow scope but not in the inlinescript scope.
func1 $Using:Item
}
}
}
对此工作流程的示例调用如下所示
PS> $MyList = 1,2,3
PS> test $MyList
Func 1, MyItem 3
Func 1, MyItem 1
Func 1, MyItem 2
logMessage, MyItem: 3
logMessage, MyItem: 2
logMessage, MyItem: 1
您将注意到(并且如预期的那样)输出顺序是随机的,因为它是并行运行的 .