直接在jenkins管道中执行powershell命令

直接在jenkins管道中执行powershell命令,powershell,jenkins,jenkins-plugins,jenkins-pipeline,Powershell,Jenkins,Jenkins Plugins,Jenkins Pipeline,是否可以在groovy脚本中直接调用PowerShell命令?在Jenkins中使用自定义作业时,我可以使用PowerShell插件调用该命令。但是在groovy脚本中没有使用这个代码段 我还尝试了sh(),但该命令似乎不允许在命令中包含多行和注释。您可以像这样使用sh命令: sh """ echo 'foo' # bar echo 'hello' """ stage ('Call Powershell Script') { node ('MyWindowsSl

是否可以在groovy脚本中直接调用PowerShell命令?在Jenkins中使用自定义作业时,我可以使用PowerShell插件调用该命令。但是在groovy脚本中没有使用这个代码段


我还尝试了
sh()
,但该命令似乎不允许在命令中包含多行和注释。

您可以像这样使用
sh
命令:

sh """
    echo 'foo'
    # bar
    echo 'hello'
"""
stage ('Call Powershell Script')
{
    node ('MyWindowsSlave') {
        PowerShell(". '.\\disk-usage.ps1'") 
    }
}

此处支持注释。

要从Groovy脚本调用PowerShell脚本,请执行以下操作:

  • 您必须使用
    bat
    命令
  • 之后,您必须确保错误代码(errorlevel)变量将正确返回(EXIT 1应导致作业失败)
  • 最后,为了与PowerShell插件兼容,您必须确保将考虑
    $LastExitCode
  • 我已经注意到“powershell”现在可以在管道中使用,但由于它有几个问题,我更喜欢这种变体。还在等待,它工作稳定。事实上,我对“dontKillMe”的行为有意见
自从Jenkins 2.207使用Powershell插件1.4以来,我用官方的Powershell管道命令替换了所有调用。我现在确实建议使用它。 请注意,您必须早于
\$ErrorActionPreference='Stop'添加到脚本中

为此,我编写了一个小groovy方法,可以集成到任何管道脚本中:

def PowerShell(psCmd) {
    psCmd=psCmd.replaceAll("%", "%%")
    bat "powershell.exe -NonInteractive -ExecutionPolicy Bypass -Command \"\$ErrorActionPreference='Stop';[Console]::OutputEncoding=[System.Text.Encoding]::UTF8;$psCmd;EXIT \$global:LastExitCode\""
}
[编辑]我添加了UTF8输出编码:与Server 2016和Win10配合使用非常好。[/EDIT] [EDIT]我已添加“%”掩码[/EDIT]

在管道脚本中,您可以这样调用脚本:

sh """
    echo 'foo'
    # bar
    echo 'hello'
"""
stage ('Call Powershell Script')
{
    node ('MyWindowsSlave') {
        PowerShell(". '.\\disk-usage.ps1'") 
    }
}
使用该方法最好的一点是,您可以调用
CmdLet
,而无需在脚本中执行此操作,这是最佳实践

调用ps1定义
CmdLet
,然后调用
CmdLet

PowerShell(". '.\\disk-usage.ps1'; du -Verbose")
  • 别忘了使用一个比完全兼容Powershell插件更好的插件
  • 使用
    推迟脚本。为了确保脚本返回错误代码时您的步骤失败(最好是这样),如果您不在意,请使用
    &

调用PowerShell脚本现在受上宣布的
PowerShell
步骤支持


提到它支持多行脚本

从管道节点和流程插件的2.28版开始,我们可以直接使用“powershell”

Eg: powershell(". '.Test.ps1'") 

这在我的一个windows节点上有效,但在另一个节点上无效。您是否需要对操作系统执行某些操作才能启用它?sh命令将启动bash会话,也将启动windows slave会话,而windows slave不是PowerShell环境。您可以在管道中尝试
sh'where ps.exe'
sh'echo$SHELL'
。请参阅:请注意,
ps.exe
必须安装在windows从属服务器上。您好,我不确定是否在这个问题上有点晚,我注意到powershell支持默认使用-NoProfile插件,您知道有没有办法解决这个问题?我似乎无法运行管道,因为我需要访问powershell配置文件。感谢您的帮助,这对我帮助很大。如何在命令中转义以使其正确显示?例如,传递:.Split(“:”)会导致命令的计算结果为。Split(:)
应该为groovy和batch屏蔽:
PowerShell(“Write Output\\\”hereXamXI\\”。Split(\\“X\\”)
为我做这件事。我更喜欢将
替换为
PowerShell(“写入输出”hereXamXI.Split('X')”)
。关于如何获取使用此解决方案的CmdLet参数的技巧?@Naxin您有几种绕过参数的方法:(1)与${PIPELINE_VAR}一起使用(小心空格)(2)使用(小心屏蔽$)。注意,这也适用于本机powershell命令。