Jenkins Groovy向PowerCLI传入-Confirm:$false参数失败
问题根因
该报错属于Jenkins Pipeline Groovy脚本的编译期错误,和VMware PowerCLI本身的命令逻辑无关:
- Jenkins Pipeline基于Groovy CPS引擎解析执行,当你使用三双引号
"""包裹字符串时,Groovy会默认将字符串内所有$开头的内容识别为变量占位符,尝试做插值替换 - 脚本里的
-Confirm:$false中,$false会被Groovy识别为待插值的Groovy变量,但流水线上下文中从未定义过名为false的变量,因此脚本在启动编译阶段直接抛出CpsCompilationErrorsException,根本不会进入PowerShell命令执行环节
相关报错截图:
修复方案
你可以任选以下一种方式修复:
方案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
相关产品推荐
相关产品推荐

