13

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

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

我得到的错误是:

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

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

4

4 回答 4

11

将工作流视为目光短浅的编程元素。

工作流无法看到超出范围内立即可用的内容。因此嵌套函数不适用于单个工作流,因为它看不到它们。

解决方法是将工作流与嵌套函数一起嵌套。比如这样:

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

更多关于它在这里

于 2014-12-08T16:51:12.210 回答
1

不是你的问题的真正答案,而是更多的跟踪。把它放在评论中会太长。

这里

当您运行脚本工作流时,Windows PowerShell 将脚本解析为抽象语法树 (AST)。“workflow”关键字的存在导致脚本到工作流编译器使用此 AST 生成 XAML,这是 Windows Workflow Foundation 运行时所需的格式。为了创建与此工作流交互的用户体验,我们创建了一个具有相同参数的包装函数,而是在 PowerShell Workflow 执行程序中协调工作流的执行。您可以通过执行以下命令来查看包装函数和生成的 XAML:

Get-Command workflow1 |Format-List *

我为您的特定工作流(请参阅上面命令中的工作流1)执行此操作,并且 XAML 和 PowerShell 生成的代码都......很有趣。XAML 代码不包含对 func2 的任何引用,但包含对 func1 的引用。

于 2014-12-08T15:55:58.310 回答
0

模糊地总结所有的反应,不要质疑它为什么会这样,只要接受它并处理它。很公平。

我已经在非工作流 Powershell 中编写了一个完整的部署管道,我想通过使用工作流的“foreach -parallel”来优化它,但是这样做的代价似乎是我必须回去重新编写整个工作流程。不幸的是,仅仅为了获得一个并行的 foreach 循环,这是一笔太大的税。

经验教训 - 从一开始就使用 Powershell 工作流程。

于 2014-12-09T08:17:25.423 回答
0

您可以将函数及其调用包装在 InlineScript 中 - 这可以是每个系统的脚本。然后在 foreach -Parallel 循环中运行该内联脚本,该循环通过您要查询的系统工作。

于 2016-01-31T12:33:06.660 回答