【问题标题】:Unable to properly pass arguments with spaces to a PowerShell script from Jenkins无法将带空格的参数正确传递给 Jenkins 的 PowerShell 脚本
【发布时间】:2022-11-24 02:26:17
【问题描述】:

我在 Jenkins 管道中有一个阶段,我在其中调用我在容器中执行的 PowerShell 脚本,我这样称呼它:

    stage('Processing') {
            container('remote') {
                sh "pwsh -file script.ps1 ${params.NAME} ${params.DESCRIPTION} ${params.PEOPLE} 
            }
    }

在脚本中,我为远程会话做了一些准备,并使用此命令调用它

Invoke-Command -Session $RemoteSession -ArgumentList $parameters -ScriptBlock $ScriptBlock

提到的准备基本上是我向 args 添加另一个参数,我喜欢这样做

    $parameters = @()
    $parameters = $parameters + $args
    $parameters += $var

在脚本块中,我通过索引引用参数,例如 $args[1]。这些主要是字符串,当从 Jenkins 传递的参数中没有空格时一切正常。但是当我们说 ${params.NAME} 中有一个空格时,但是索引不能正常工作,因为空格将原始字符串分隔成多个参数,因此如果原始索引是 $args[1],而不是接受${params.DESCRIPTION}的值,它接受了${params.NAME}的一部分。

你知道如何避免这个问题并使用原始索引接收参数,即使它有空格吗?

【问题讨论】:

    标签: powershell shell jenkins


    【解决方案1】:
    • 要使 PowerShell 将扩展值(例如 ${params.NAME})视为每个参数,请将它们括在 " 中,在 "..." 的上下文中,Groovy 字符串必须转义为 "

    所以:

    sh "pwsh -File script.ps1 "${params.NAME}" "${params.DESCRIPTION}" "${params.PEOPLE}""
    

    【讨论】:

    • 感谢您的建议,但在测试时,脚本返回退出代码 126,并且在阶段运行期间再次将 args 视为“”“”“”。
    • 获取退出代码 126 意味着 sh 确实不是使用 PowerShell,实际上在类 Unix 平台上可能只是 /bin/sh。你能证实后者吗?
    • 我尝试将行更改为 sh script: "./script.ps1 "${params.NAME}" "${params.DESCRIPTION}" "${params.PEOPLE}"" 并且 args 被捕获为最初输入的,空格包含在变量中,因此基本上感知到的参数数量是预期的。不幸的是,该脚本仍然产生退出代码 126
    • @BlackShark:126/bin/sh 告诉您指定的文件存在,但不可执行 - .ps1 脚本确实是这种情况(除非您明确使其可执行并添加 shebang 行)。这意味着您必须通过pwsh 拨打电话,毕竟,我修改后的答案现在显示了这一点。查看您现在获得的退出代码。如果是127,则说明在$PATH中找不到pwsh
    • 如果我在引用文件 (./script.ps1) 之前运行 put 上面的行但“pwsh”,则 args 被认为是预期的并且运行完全成功。非常感谢您的帮助 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多