You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins Groovy向PowerCLI传入-Confirm:$false参数失败

问题根因

该报错属于Jenkins Pipeline Groovy脚本的编译期错误,和VMware PowerCLI本身的命令逻辑无关:

  • Jenkins Pipeline基于Groovy CPS引擎解析执行,当你使用三双引号"""包裹字符串时,Groovy会默认将字符串内所有$开头的内容识别为变量占位符,尝试做插值替换
  • 脚本里的-Confirm:$false中,$false会被Groovy识别为待插值的Groovy变量,但流水线上下文中从未定义过名为false的变量,因此脚本在启动编译阶段直接抛出CpsCompilationErrorsException,根本不会进入PowerShell命令执行环节

相关报错截图:
Jenkins Pipeline编译错误截图

修复方案

你可以任选以下一种方式修复:

方案1:转义$符号跳过Groovy插值

在需要传给PowerShell的$符号前加反斜杠\,告诉Groovy这个$是普通字符,不需要做插值解析,修改后的代码如下:

def stopVM(String vmName) {
    powershell (returnStdout: true, script: """ Stop-VM \"${vmName}\" -Confirm:\$false """)
}

这是改动最小、最常用的修复方式。

方案2:使用单引号三引号定义纯文本脚本

Groovy中三单引号'''包裹的字符串是纯文本,不会触发任何变量插值,适合写固定的PowerShell逻辑。注意如果需要传入Groovy侧的vmName变量,需要通过字符串拼接的方式传入:

def stopVM(String vmName) {
    powershell (returnStdout: true, script: ''' Stop-VM "''' + vmName + '''" -Confirm:$false ''')
}

方案3:通过PowerShell全局配置跳过确认

你也可以不直接传-Confirm:$false,而是在PowerShell脚本头部设置全局确认偏好,同样能达到跳过交互确认的效果:

def stopVM(String vmName) {
    powershell (returnStdout: true, script: """
        \$ConfirmPreference = 'None'
        Stop-VM -Name \"${vmName}\"
    """)
}

补充说明:如果后续你在Jenkins Pipeline里给PowerShell传其他带$的PowerShell变量(比如$env、自定义PS变量),都需要按上述规则对$做转义,或者用单引号字符串避免Groovy插值。

内容的提问来源于stack exchange,提问作者Sagar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 12:18:22