Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • PowerShell is a frequently used scripting language available for Linux, MacOS, Windows and other platforms.
  • JS7 offers the JS7 - PowerShell Module for simplified access to the JS7 - REST Web Service API
  • This article explains how to syntactically include PowerShell scripts with JS7 job scripts

Unix

  • Find the below examples for download: run-powershell-unix.workflow.json
  • In order to directly add PowerShell script code to a JS7 shell job script the recommended approach is to use a shebang like this:

    Code Block
    languagebash
    titleExample how use PowerShell script code with a shebang
    #!/usr/bin/env pwsh
     
    Write-Output "Hello"
    Write-Output "world"
  • As an a bad alternative the PowerShell executable can be invoked directly and can be parameterized like this

    Code Block
    languagebash
    titleExample how to pass a variable to subsequent jobs with Windowsadd PowerShell script code from a single line
    pwsh -NoLogo -NonInteractive -Command '& { Echo "Hello"; Echo "World"; }'


    Explanation:

    • Consider the quoting: when using the -Command parameter then the PowerShell script has to be specified from a string. This includes to 
      • quote the script by single quotes.
      • quote code inside the script with double quotes or to use escape characters for single quotes.
    • Consider that each PowerShell command has to be terminated with a semicolon.

  • An even more weird way how to add PowerShell code to

    a

    JS7 job

    script

    scripts includes:

    Code Block
    languagebash
    titleExample how to pass a variable to subsequent jobs with Windowsadd PowerShell script code from a multiple lines
    pwsh -NoLogo -NonInteractive -Command '& { `
      Echo "Hello"; `
      Echo "World"; `
    }'


    Explanation:

    • Consider use of single quotes and , double quotes and semicolons as from the previous example. 
    • In addition each line of script code has to be terminated with a backtick for line continuation.

...

Windows

  • To address the problem of special characters use base64 encoding for variable values as this encoding results in a single printable string.
  • To address the limitation concerning the size of environment variables do not use them and think about ways how to directly append lines to the temporary file indicated by JS7_RETURN_VALUES

Example

  • Find the below examples for download: run-powershell-windows.workflow.json
  • In order to directly add PowerShell script code to a JS7 shell job script the recommended approach is to use a shebang replacement like this

    Let's assume two jobs to be executed in sequence:
  • The first job creates a lengthy e-email body in HTML format,
  • The second job sends e-mail and makes use of the HTML body. Find a number of possible implementations for the JS7 job script

    :

    Code Block
    titleExample for PowerShell version on Windows (multi-line)
    Code Block
    languagebash
    titleExample
    for Shell version using environment variables on Unix
    #!/user/bin/env bash
    
    mailBody="<html><body><b>hello</b> <i>world</i></body></html>"
    mailBodyEncoded=$(echo $mailBody | base64)
    echo "body=base64:$mailBodyEncoded" >> $JS7_RETURN_VALUES
    Code Block
    languagebash
    titleExample for Shell version using files on Unix
    #!/user/bin/env bash
    
    echo "<html><body><b>hello</b> <i>world</i></body></html>" > /tmp/mail-body.html
    echo "body=base64:$(cat /tmp/mail-body.html | base64)" >> $JS7_RETURN_VALUES
    Code Block
    languagebash
    titleExample for PowerShell version on Unix
    #!/usr/bin/env pwsh
    
    $mailBody = "<html><body><b>hello</b> <i>world</i></body></html>"
    $mailBodyEncoded = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes( $mailBody ))
    "body=base64:$mailBodyEncoded" | Out-File $env:JS7_RETURN_VALUES -Append
    how use PowerShell script code with a shebang replacement
    @@findstr/v "^@@f.*&" "%~f0"|pwsh.exe -&goto:eof
    
    Write-Output "Hello" 
    Write-Output "world" 


    Explanation:

  • As a bad alternative the PowerShell executable can be invoked directly and can be parameterized like this

    Code Block
    languagebash
    titleExample how to add PowerShell script code from a single line
    $mailBody = "<html><body><b>hello</b> <i>world</i></body></html>" $mailBodyEncoded = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes( $mailBody )) "body=base64:$mailBodyEncoded" | Out-File $env:JS7_RETURN_VALUES -Append Code BlocktitleExample for PowerShell version on Windows (single-line)
    pwsh.exe -NoLogo -NonInteractive -Command "& { Echo ""
    body=base64:$([System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes( '<html><body><b>hello</b> <i>world</i></body></html>' )) )"" | Out-File $env:JS7_RETURN_VALUES -Append
    Flight Destination: $env:FLIGHT_DESTINATION""; Echo ""Booking Code: $env:BOOKING_CODE""; }"


    Explanation:

    • Consider the quoting: when using the -Command parameter then the PowerShell script has to be specified from a string. This includes to 
      • quote the script by double quotes.
      • quote code inside the script with two double quotes or to use single quotes.
    • Consider that each PowerShell command has to be terminated with a semicolon
    • In fact the e-mail body is not too lengthy, however, it suggests that an e-mail body of arbitrary size would be imported by some template file as e.g. for PowerShell with $mailBody = Get-Content "mail-body.html"

      • The above bash version with files and the PowerShell version both work with arbitrary length values.
    • Base64 encoding is available from a number of sources such as the base64 Unix utility or the .NET Core class.
    • The value of the body variable is prefixed with base64: to indicate the encoding.
    • The subsequent JS7 - JITL MailJob accepts the body variable, identifies the encoding and automatically decodes the argument value.