将以下内容复制并粘贴到新的Powershell ISE脚本中,然后点击F5:
workflow workflow1{
"in workflow1"
func1
}
function func1 {
"in func1"
func2
}
function func2 {
"in func2"
}
workflow1
我得到的错误是:
术语“func2”未被识别为cmdlet函数的名称, 脚本文件或可操作程序
我不明白这一点。为什么func1会在范围内而不是func2? 任何帮助非常感谢。 TIA。
答案 0 :(得分:10)
将工作流视为短视的编程元素。
工作流程无法看到范围内可立即使用的内容。 因此,嵌套函数不能与单个工作流一起使用,因为它无法看到它们。
修复方法是嵌套工作流和嵌套函数。比如这个:
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
有关它的更多信息here
答案 1 :(得分:1)
不是你的问题的答案,而是更多的跟踪道路。把它放在评论中会太长。
来自here:
运行脚本工作流时,Windows PowerShell会解析脚本 到一个抽象语法树(AST)。 “工作流程”的存在 关键字使脚本到工作流编译器使用此AST 生成XAML,Windows Workflow Foundation所需的格式 运行。创建与此交互的用户体验 工作流,然后我们创建一个具有相同的包装函数 参数 - 而是协调工作流的执行 PowerShell Workflow执行程序。你可以看到两个包装器 通过执行以下函数和生成的XAML:
Get-Command workflow1 |Format-List *
我为您的特定工作流做了这些(请参阅上面命令中的workflow1),XAML和PowerShell生成的代码都很有趣。 XAML代码不包含对func2的任何引用,但包含对func1的引用。
答案 2 :(得分:0)
模糊地总结所有回答,不要质疑它为什么会这样做,只要接受它做并处理它。很公平。
我在非工作流程Powershell中编写了一个完整的部署管道,我想通过使用工作流程的“foreach -parallel”来优化它,但是这样做的税收似乎是我必须回去在工作流程中重写整个事情。不幸的是,为了得到一个平行的foreach循环而付出的代价太大了。
获得的经验 - 从一开始就使用Powershell工作流程。
答案 3 :(得分:0)
您可以将函数及其调用包装在InlineScript中 - 这可能是每个系统的脚本。然后在foreach -Parallel循环中运行该inlinescript,处理您想要查询的系统。