了解PowerShell工作流中的功能范围

时间:2014-12-08 14:27:00

标签: powershell powershell-workflow

将以下内容复制并粘贴到新的Powershell ISE脚本中,然后点击F5:

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

我得到的错误是:

  

术语“func2”未被识别为cmdlet函数的名称,   脚本文件或可操作程序

我不明白这一点。为什么func1会在范围内而不是func2? 任何帮助非常感谢。 TIA。

4 个答案:

答案 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,处理您想要查询的系统。