在 Jenkins 变量中保存 powershell return 值

Save powershell return value in a Jenkins Variable

我在 Jenkins 中有一个脚本化管道,我正在调用一个 powershell 脚本来生成指向 onedrive 中文件的链接,这样我就可以在下一步中使用插件发送它们。我尝试使用以下方法来完成此操作

def return_val = powershell script: "Path\to\script\someScript.ps1", returnStatus: true 基于这个答案

然而,我得到

Caught: groovy.lang.MissingMethodException: No signature of method: hudson7145251072251175654.node() is applicable for argument types: (hudson7145251072251175654$_run_closure1) values: [hudson7145251072251175654$_run_closure1@46271dd6] Possible solutions: use([Ljava.lang.Object;), notify(), wait(), run(), run(), any()

这是我正在使用的 powershell 脚本。

#Config Variables
$SiteURL = "https://company-my.sharepoint.com/personal/name"
$FolderURL= "/Documents/Desktop" #Folder's Site Relative Path
Connect-PnPOnline -Url $SiteURL -Interactive
$Context.Credentials = $Credentials
$linklist =[System.Collections.ArrayList]@()
linkfunction {
    $FolderItems = @(Get-PnPFolderItem -FolderSiteRelativeUrl $FolderURL -ItemType File)
    foreach($item in $folderItems)
      {
        $linklist.Add($item.Name)
        Write-Host $linklist
      }
    return $linklist

powershell returnStatus: true 仅 return 来自 PowerShell 脚本的数字 退出代码 (成功时为 0,但可以通过以下方式设置为不同的值例如从 PowerShell 调用 exit 42

要return字符串或其他复杂数据从PowerShell到Groovy,需要使用powershell returnStdout: true。这为您提供了 PowerShell 的整个输出,这些输出作为单个(可能是多行)字符串写入 成功输出流

简化的 PowerShell 脚本:

$list = [System.Collections.ArrayList]@()
$null = $list.Add('foo\bar')
$null = $list.Add('baz')
$list  # Implicit output, a "return" statement is not required in PowerShell

分配给 $null 确保 ArrayList.Add() 的 return 值不会作为 PowerShell 脚本的(不需要的)输出结束。

这会在自己的行上输出每个数组元素:

foo\bar
baz

要将 PowerShell 输出返回到 Groovy 端的数组,我们可以这样做:

def return_val = powershell script: "Path\to\script\someScript.ps1", returnStdout: true
def return_array = return_val.split(/\r?\n/)

这里return_val是一个多行字符串。使用 String.split() 方法,我们将其转回数组并将其存储在变量 return_array.

String.split() 需要一个正则表达式,用于定义拆分字符串的位置。正则表达式 \r?\n 在 Windows \r\n 和 Unix-style \n 行结束处拆分。我正在使用 slashy string 文字来避免必须转义反斜杠,这对于 RegEx 模式非常方便。