您可以在 Azure 管道 YAML 文件的内联 powershell 脚本中使用函数吗?

Can you have a function in an inline powershell script in a Azure pipeline YAML file?

我希望能够使用函数简化 AzureCLI 任务中的一些内联 powerscript,类似于以下内容:

  - task: AzureCLI@2
    displayName: "My Task"
    inputs:
      scriptType: pscore
      scriptLocation: inlineScript
      inlineScript: |
        Do-Something "hello" "world"
        Do-Something "goodbye" "world"

        function Do-Something { 
          Param
          (
            [Parameter(Mandatory=$true, Position=0)]
            [string] $Hello,
            [Parameter(Mandatory=$true, Position=1)]
            [string] $World
          )

          Write-Host "$Hello $World"
        }

但是失败并出现以下错误:

+ Do-Something "hello" "world"
+ ~~~~~~~
+ CategoryInfo          : ObjectNotFound: (Do-Something:String) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : CommandNotFoundException
##[error]Script failed with exit code: 1

这可能吗?如果是这样,我做错了什么?

Mathias R. Jessen提供了关键指针:

Azure 的使用 偶然 你的问题,它源于 PowerShell 的基本行为:

  • 与其他语言不同,PowerShell 执行 函数提升, ...

  • ... 这意味着 你必须在 之前声明你的函数 你可以调用它们 ,即您的源代码必须将函数定义放在之前任何调用它的语句。

相关的概念性帮助主题,about_Functions,历史上并没有说清楚,很遗憾,但这已经得到纠正。现有 PowerShell 安装的离线帮助需要手动更新才能看到更改。


为您的代码拼出解决方案:

 - task: AzureCLI@2
    displayName: "My Task"
    inputs:
      scriptType: pscore
      scriptLocation: inlineScript
      inlineScript: |
        # First, declare the function.
        function Do-Something { 
          Param
          (
            [Parameter(Mandatory=$true, Position=0)]
            [string] $Hello,
            [Parameter(Mandatory=$true, Position=1)]
            [string] $World
          )

          Write-Host "$Hello $World"
        }

        # Now you can call it.
        Do-Something "hello" "world"
        Do-Something "goodbye" "world"