...
Example: PowerShell Job
Example 1: A simple PowerShell job with some scripting similar to shell jobs might look like this:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<?xml version="1.0" encoding="ISO-8859-1"?> <job process_class="my_Agent"> <script language="powershell"> <![CDATA[ echo "job is starting" # pause the job for 10 seconds Start-Sleep -Seconds 10 # list files in a directory $files = dir * echo $files # execute some Windows command script /tmp/some_batch_script.cmd echo "job is finishing" ]]> </script> <run_time /> </job> |
Example 2: A basic PowerShell job including the call to a function might look like this:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<?xml version="1.0" encoding="ISO-8859-1"?> <job process_class="my_Agent"> <script language="powershell"> <![CDATA[ # PowerShell function used in main job function Get-Files( $directory ) { echo "entering function get_files" return Get-ChildItem $directory } echo "job is starting" Start-Sleep -Seconds 10 $files = Get-Files "c:\tmp\my_directory" echo $files echo "job is finishing" ]]> </script> <run_time /> </job> |
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<?xml version="1.0" encoding="ISO-8859-1"?> <job process_class="/tests/Agent" stop_on_error="no"> <script language="powershell"> <![CDATA[ function spooler_process() { # set variables to store the information about job and task $jobName = $spooler_job.name() $jobTitle = $spooler_job.title() $taskId = $spooler_task.id() # display the information about job and task echo "job $jobName with title $jobTitle is starting" echo "task ID is $taskId" echo "job is finishing" # for standalone jobs set return code to false / for order jobs set to true in case of successful execution return $false } ]]> </script> <run_time /> </job> |
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<?xml version="1.0" encoding="ISO-8859-1"?> <job process_class="my_Agent"> <script language="powershell"> <![CDATA[ echo "job is starting" Start-Sleep -Seconds 10 echo "job is finishing" ]]> </script> <monitor name="process_powershell" ordering="0"> <script language="powershell"> <![CDATA[ function spooler_process_before() { # check for a "go" file that is required to start the job $rc = ( Test-Path -Path "/tmp/go.txt" -PathType Leaf ) echo ".. looking up go file: $rc" return $rc } ]]> </script> </monitor> <run_time /> </job> |
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<?xml version="1.0" encoding="ISO-8859-1"?> <job process_class="my_Agent" stop_on_error="no"> <settings > <log_level ><![CDATA[debug1]]></log_level> </settings> <script language="powershell"> <![CDATA[ # Use Write-Output or Echo cmdlets to write to the JobScheduler log Write-Output "job: this is some output" echo "job: this is some output" # This does not work: Use of Write-Host cmdlet is not applicable # Write-Host "job: this is some output" # Standard PowerShell verbose setting is considered for log output $VerbosePreference = "Continue" Write-Verbose "job: this is some verbose output" # Standard PowerShell debug setting is considered for log output $DebugPreference = "Continue" # In addition the current log level of the job has to be set, e.g. log level "debug1" logs debug messages Write-Debug "job: this is some debug output" # creates a warning for the job Write-Warning "job: this is a warning" # can be used to throw an error # Write-Error "job: this is an error" ]]> </script> <run_time /> </job> |
Explanations
- Using PowerShell standard output
- Use of the
Write-Output
andEcho
cmdlets is applicable. - Use of the
Write-Host
cmdlet is not applicable for PowerShell jobs as the cmdlet requires a PowerShell host console to be available (powershell.exe
), whereas JobScheduler runs PowerShell in a process without interaction.
- Use of the
- Using PowerShell verbose output
- The standard PowerShell verbosity setting is considered for log output
- Use
$VerbosePreference = "Continue"
- Subsequently use the
Write-Verbose
cmdlet.
- Using PowerShell debug messages
- The PowerShell debug setting is considered for log output in jobs by use of
$DebugPreference = "Continue"
- In addition, the current log level of the job has to be set, e.g. log level
debug1
will log debug messages.- With the JobScheduler log level being switched to
info
no debug output is written to the log file. - With the JobScheduler log level being switched to
debug1
,debug2
, ...,debug9
then debug output is added to the log.
- With the JobScheduler log level being switched to
- The PowerShell debug setting is considered for log output in jobs by use of
- Using PowerShell Warnings
- Warnings are created by use of the
Write-Warning
cmdlet. Such warnings create corresponding warnings in the JobScheduler Master that are visible from the log and that might trigger a notification by mail.
- Warnings are created by use of the
- Using PowerShell Error Messages
- Use of the
Write-Error
cmdlet will create a job error that is visible from the log and that triggers subsequent actions as e.g. notification by mail, stopping the job, suspending an order etc.
- Use of the
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<?xml version="1.0" encoding="ISO-8859-1"?> <job process_class="my_Agent"> <script language="powershell"> <![CDATA[ Import-Module JobScheduler # display summary information Show-Status # retrieve the number of available job chains ( Get-JobChain ).count # get the number of current tasks ( Get-Task ).count ]]> </script> <run_time /> </job> |
...
Please consider compatibility issues as explained below.
...
Reading Order parameters or Job parameters
Calling Reading parameters works differently slightly different for PowerShell jobs than for shell jobs, using $env:VARIABLE
for PowerShell instead of %VARIABLE%
as for shell:
Code Block |
---|
# Example Shell: environment variable for task/order parameter myscript.cmd %SCHEDULER_PARAM_NAME1% # Example PowerShell solution 1: environment variable for task/order parameter myscript.cmd $env:SCHEDULER_PARAM_NAME1 # Example PowerShell solution 2: shorthand notation for task/order parameter myscript.cmd $spooler_params.item( "name1" ) # Example PowerShell solution 3: access task parameter myscript.cmd $spooler_task.params().value( "name1" ) # Example PowerShell solution 4: access order parameter myscript.cmd $spooler_task.order().params().value( "name1" ) |
Returning a parameter and its value to an Order
...