functions/Get-JobSchedulerLock.ps1

function Get-JobSchedulerLock
{
<#
.SYNOPSIS
Returns job information from the JobScheduler Master.
 
.DESCRIPTION
Jobs are returned from a JobScheduler Master. Jobs can be selected by name, folder, status etc. including sub-folders.
 
The job information retured includes volatile status information and the permanent configuration.
The cmdlet optionally returns the task history and logs of recent task executions.
 
Resulting jobs can be forwarded to other cmdlets for pipelined bulk operations.
 
.PARAMETER Job
Optionally specifies the path and name of a job.
If the name of a job is specified then the -Directory parameter is used to determine the folder.
Otherwise the -Job parameter is assumed to include the full path and name of the job.
 
One of the parameters -Directory, -JobChain or -Job has to be specified.
 
.PARAMETER JobChain
Optionally specifies the path and name of a job chain that includes jobs.
If the name of a job chain is specified then the -Directory parameter is used to determine the folder.
Otherwise the -JobChain parameter is assumed to include the full path and name of the job chain.
 
One of the parameters -Directory, -JobChain or -Job has to be specified.
 
.PARAMETER Directory
Optionally specifies the folder for which jobs should be returned. The directory is determined
from the root folder, i.e. the "live" directory.
 
.PARAMETER Recursive
Specifies that any sub-folders should be looked up when used with the -Directory parameter.
By default no sub-folders will be looked up for jobs.
 
.PARAMETER Compact
Specifies that a smaller subset of information is provided, e.g. no task queues for jobs.
By default all information available for jobs is returned.
 
.PARAMETER WithHistory
Specifies the task history to be returned.
The parameter -MaxLastHstoryitems specifies the number of history items returned.
 
This operation is time-consuming and should be restricted to selecting individual jobs.
 
.PARAMETER WithLog
Specifies the task log to be returned. This implicitely includes to return the task history.
For each history item - up to the number speicifed with the -MaxLastHistoryItems parameter -
the task log is returned.
 
This operation can be time-consuming.
 
.PARAMETER MaxLastHistoryItems
Specifies the number of the most recent history items of task executions to be returned.
 
Default: 1
 
.PARAMETER IsOrderJob
Specifies to exclusively return jobs that can be used in job chains.
 
.PARAMETER IsStandaloneJob
Specifies to exclucively return jobs that can be used standalone (without job chains).
 
.PARAMETER Pending
Returns jobs in a pending state, i.e. jobs that are ready to be executed at a later date.
 
.PARAMETER Stopped
Returns stopped jobs. Such jobs would not restart automatically.
 
.PARAMETER Running
Specifies that jobs with running tasks should be returned.
 
.PARAMETER Enqueued
Specifies that jobs with enqueued tasks should be returned.
 
.OUTPUTS
This cmdlet returns an array of job objects.
 
.EXAMPLE
$jobs = Get-JobSchedulerJob
 
Returns all jobs from all directories recursively.
 
.EXAMPLE
$jobs = Get-JobSchedulerJob -Directory /test
 
Returns all jobs that are configured with the folder "test"
without consideration of sub-folders.
 
.EXAMPLE
$jobs = Get-JobSchedulerJob -Directory /test -Recursive
 
Returns all jobs that are configured with the folder "test"
include jobs from any sub-folders.
 
.EXAMPLE
$jobs = Get-JobSchedulerJob -JobChain /test/globals/job_chain1
 
Returns the jobs that are associated with the job chain "job_chain1" from the folder "/test/globals".
 
.EXAMPLE
$jobs = Get-JobSchedulerJob -Job /test/globals/job1
 
Returns the job "job1" from the folder "/test/globals".
 
.EXAMPLE
$jobs = Get-JobSchedulerJob -Stopped
 
Returns any stopped jobs.
 
.EXAMPLE
$jobs = Get-JobSchedulerJob -Directory /test -Pending -Running
 
Returns any pending or running jobs from the "/test" directory.
 
.LINK
about_jobscheduler
 
#>

[cmdletbinding()]
param
(
    [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)]
    [string] $Lock,
    [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)]
    [string] $Directory = '/',
    [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)]
    [switch] $Recursive
)
    Begin
    {
        Approve-JobSchedulerCommand $MyInvocation.MyCommand
        $stopWatch = Start-JobSchedulerStopWatch

        $locks = @()
        $folders = @()
    }

    Process
    {
        Write-Debug ".. $($MyInvocation.MyCommand.Name): parameter Directory=$Directory, Recursive=$Recursive, Lock=$Lock"

        if ( !$Directory -and !$Lock )
        {
            throw "$($MyInvocation.MyCommand.Name): no directory or lock specified, use -Directory or -Lock"
        }

        if ( $Directory -and $Directory -ne '/' )
        {
            if ( !$Directory.startsWith( '/' ) ) {
                $Directory = '/' + $Directory
            }

            if ( $Directory.endsWith( '/' ) )
            {
                $Directory = $Directory.Substring( 0, $Directory.Length-1 )
            }
        }

        if ( $Lock )
        {
            if ( (Get-JobSchedulerObject-Basename $Lock) -ne $Lock ) # lock name includes a directory
            {
                $Directory = Get-JobSchedulerObject-Parent $Lock
            } else { # lock name includes no directory
                if ( $Directory -eq '/' )
                {
                    $Lock = $Directory + $Lock
                } else {
                    $Lock = $Directory + '/' + $Lock
                }
            }
        }

        if ( $Directory -eq '/' -and !$Lock -and !$Recursive )
        {
            $Recursive = $true
        }

        if ( $Lock )
        {
            $locks += $Lock
        }

        if ( $Directory )
        {
            $objFolder = New-Object PSObject
            Add-Member -Membertype NoteProperty -Name 'folder' -value $Directory -InputObject $objFolder
            Add-Member -Membertype NoteProperty -Name 'recursive' -value ($Recursive -eq $true) -InputObject $objFolder

            $folders += $objFolder
        }
    }

    End
    {
        $body = New-Object PSObject
        Add-Member -Membertype NoteProperty -Name 'jobschedulerId' -value $script:jsWebService.JobSchedulerId -InputObject $body

        if ( $locks )
        {
            Add-Member -Membertype NoteProperty -Name 'locks' -value $locks -InputObject $body
        }

        if ( $folders )
        {
            Add-Member -Membertype NoteProperty -Name 'folders' -value $folders -InputObject $body
        }

        [string] $requestBody = $body | ConvertTo-Json -Depth 100
        $response = Invoke-JobSchedulerWebRequest -Path '/locks/p' -Body $requestBody

        if ( $response.StatusCode -eq 200 )
        {
            $returnLocks = ( $response.Content | ConvertFrom-Json ).locks
        } else {
            throw ( $response | Format-List -Force | Out-String )
        }

        $returnLocks | Select-Object -Property `
                                            name, `
                                            @{name='lock'; expression={ $_.path }}, `
                                            path, `
                                            maxNonExclusive, `
                                            configurationDate, `
                                            surveyDate

        if ( $returnLocks.count )
        {
            Write-Verbose ".. $($MyInvocation.MyCommand.Name): $($returnLocks.count) locks found"
        } else {
            Write-Verbose ".. $($MyInvocation.MyCommand.Name): no locks found"
        }

        Trace-JobSchedulerStopWatch $MyInvocation.MyCommand.Name $stopWatch
    }
}