Versions Compared

Key

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

...

Example: PowerShell Job

Example 1: A simple PowerShell job with some scripting similar to shell jobs might look like this:

Code Block
languagepowershell
titleSimple PowerShell Job
collapsetrue
<?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
languagepowershell
titlePowerShell Job with user defined function
collapsetrue
<?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
languagepowershell
titlePowerShell Job with API methods
collapsetrue
<?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
languagepowershell
titlePowerShell Job with pre-processing Monitor
collapsetrue
<?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
languagepowershell
titlePowerShell Job with different output channels
collapsetrue
<?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

  1. Using PowerShell standard output
    • Use of the Write-Output and Echo 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.
  2. Using PowerShell verbose output
    • The standard PowerShell verbosity setting is considered for log output
    • Use $VerbosePreference = "Continue" 
    • Subsequently use the Write-Verbose cmdlet.
  3. 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 debug1debug2, ..., debug9 then debug output is added to the log.
  4. 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.
  5. 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. 

...

Code Block
languagepowershell
titlePowerShell Job with CLI cmdlets
collapsetrue
<?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

...