【问题标题】:Understanding scope of functions in powershell workflow了解 PowerShell 工作流程中的功能范围
【发布时间】:2015-08-06 12:36:49
【问题描述】:

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

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

我得到的错误是:

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

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

【问题讨论】:

  • 这很有趣。如果我不得不猜测,那是因为Func1 是直接从工作流定义中调用的,而func2 不是。从阅读有关工作流处理的信息来看,在范围之间工作似乎确实存在许多限制。

标签: powershell powershell-workflow


【解决方案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

更多信息here

【讨论】:

  • 谢谢米奇。虽然有点烦人,我有我想在不同的工作流程中使用的功能,但现在我不能。有点违背了函数 IMO 的目的。
  • @jamiet 真的迟到了,但是您可以将函数放在一个模块中,然后为每个需要它的工作流导入该模块。
【解决方案2】:

并不是您的问题的真正答案,而是更多要遵循的轨道。将此放在评论中会太长。

来自here

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

Get-Command workflow1 |Format-List *

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

【讨论】:

  • 有趣,你似乎对大卫感兴趣。我会继续挖掘
  • 如果您在工作流中调用Get-ChildItem function:func*,它根本不会列出func1func2。似乎确实有很多seemingly arbitrary restrictions on workflows,但似乎没有很好的记录。我的意思是,有一个ton of examples,但这并不能解释事情是如何工作的,只是他们这样做了。 This 是我能找到的最好的资源。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2015-05-02
      • 2020-02-16
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2011-12-17
      相关资源
      最近更新 更多