26

Is it possible to call a PowerShell command directly in the pipelines groovy script? While using custom jobs in Jenkins I am able to call the command with the PowerShell Plugin. But there is no snippet to use this in the groovy script.

I also tried sh() but it seems that this command does not allow multiple lines and comments inside the command.

4 Answers 4

35

To call a PowerShell script from the Groovy-Script:

  • you have to use the bat command.
  • After that, you have to be sure that the Error Code (errorlevel) variable will be correctly returned (EXIT 1 should resulting in a FAILED job).
  • Last, to be compatible with the PowerShell-Plugin, you have to be sure that $LastExitCode will be considered.
  • I have notice that the 'powershell' is now available in pipeline, but since it have several issues I prefer this variant. Still waiting it works stabil. I actually have an issue with the 'dontKillMe' behavior.

Since Jenkins 2.207 with Powershell plugin 1.4, I have replace all my calls with the official powershell pipeline command. I do now recommend to use it. Note that you must predent \$ErrorActionPreference='Stop'; to your Script if you want it to abort on Write-Error because of an Issue with the powershell plugin.

For that porpuse I have written a little groovy method which could be integrate in any pipeline-script:

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\""
}

[EDIT] I have added the UTF8 OutputEncoding: works great with Server 2016 and Win10.[/EDIT] [EDIT] I have added the '%' mask[/EDIT]

In your Pipeline-Script you could then call your Script like this:

stage ('Call Powershell Script')
{
    node ('MyWindowsSlave') {
        PowerShell(". '.\\disk-usage.ps1'") 
    }
}

The best thing with that method, is that you may call CmdLet without having to do this in the Script, which is best-praxis.

Call ps1 to define CmdLet, an then call the CmdLet

PowerShell(". '.\\disk-usage.ps1'; du -Verbose")
  • Do not forget to use withEnv() an then you are better than fully compatible with the Powershell plugin.
  • postpone your Script with . to be sure your step failed when the script return an error code (should be preferred), use & if you don't care about it.
Sign up to request clarification or add additional context in comments.

4 Comments

Thanks for this, it's helped me out a lot. How would you escape " in the command so that it shows up properly? For example, passing: .Split(":") results in the command being evaluated as .Split(:)
" should be masked for groovy and batch: PowerShell("Write-Output \\\"hereXamXI\\\".Split(\\\"X\\\")") do the thing for me. I prefer to replace " by ': PowerShell("Write-Output 'hereXamXI'.Split('X')"). Regards
Is there a trick to getting arguments for CmdLet working with this solution?
@Naxin you have several ways to bypass Parameters: (1) Use Groovy substitution with ${PIPELINE_VAR} (be carefull with spaces) (2) Use Powershell susbstitution with environment variables (be carefull with masking $). Note this also apply to the native powershell command.
29

Calling PowerShell scripts is now supported with powershell step as announced on Jenkins blog.

The documentation mentions it supports multiple lines scripts.

2 Comments

Hi, not sure if I'm a bit late on this issue, I noticed that the powershell support by default use the -NoProfile plugin, do you know is there a way around this? I can't seem to run my pipeline as I need access to the powershell profile.
How to run a PowerShell script file .ps1 using the powershell step?
2

From version 2.28 of Pipeline Nodes and Processes Plugin, we can directly use 'powershell'.

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

Comments

-9

You can use the sh command like this:

sh """
    echo 'foo'
    # bar
    echo 'hello'
"""

Comments are supported in here.

2 Comments

that works on one of my windows nodes but not the other. Is there something you need to do to the OS to enable it?
the sh command will start a bash session, also with windows slave, which is not a PowerShell environment. You can try sh 'where ps.exe' or sh 'echo $SHELL' in your Pipeline. See : link Note that ps.exemust be install on the windows slave.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.