直接在jenkins管道中执行powershell命令
是否可以在groovy脚本中直接调用PowerShell命令?在Jenkins中使用自定义作业时,我可以使用PowerShell插件调用该命令。但是在groovy脚本中没有使用这个代码段直接在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
我还尝试了
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”的行为有意见
\$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命令。