Public/Remove-RSJob.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
Function Remove-RSJob {
    <#
        .SYNOPSIS
            Deletes a Windows PowerShell runspace job.
 
        .DESCRIPTION
            Deletes a Windows PowerShell background job that has been started using Start-RSJob
 
        .PARAMETER Job
            The job object to remove.
 
        .PARAMETER Name
            The name of the jobs to remove..
 
        .PARAMETER ID
            The ID of the jobs to remove.
 
        .PARAMETER InstanceID
            The GUID of the jobs to remove.
 
        .PARAMETER Batch
            Name of the set of jobs to remove.
 
        .PARAMETER Force
            Force a running job to stop prior to being removed.
 
        .NOTES
            Name: Remove-RSJob
            Author: Boe Prox/Max Kozlov
 
        .EXAMPLE
            Get-RSJob -State Completed | Remove-RSJob
 
            Description
            -----------
            Deletes all jobs with a State of Completed.
 
            .EXAMPLE
            Remove-RSJob -ID 1,5,78
 
            Description
            -----------
            Removes jobs with IDs 1,5,78.
    #>

    [cmdletbinding(
        DefaultParameterSetName='Job',
        SupportsShouldProcess = $True
    )]
    Param (
        [parameter(ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True,
        ParameterSetName='Job', Position=0)]
        [Alias('InputObject')]
        [RSJob[]]$Job,
        [parameter(ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True,
        ParameterSetName='Name', Position=0)]
        [string[]]$Name,
        [parameter(ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True,
        ParameterSetName='Id', Position=0)]
        [int[]]$Id,
        [parameter(ValueFromPipelineByPropertyName=$True,
        ParameterSetName='InstanceID')]
        [string[]]$InstanceID,
        [parameter(ValueFromPipelineByPropertyName=$True,
        ParameterSetName='Batch')]
        [string[]]$Batch,

        [parameter()]
        [switch]$Force
    )
    Begin {
        If ($PSBoundParameters['Debug']) {
            $DebugPreference = 'Continue'
        }
        $List = New-Object System.Collections.ArrayList
    }
    Process {
        Write-Debug "ParameterSet: $($PSCmdlet.ParameterSetName)"
        $Property = $PSCmdlet.ParameterSetName
        if ($PSBoundParameters[$Property]) {
            Write-Verbose "Adding $($PSBoundParameters[$Property])"
            [void]$List.AddRange($PSBoundParameters[$Property])
        }
    }
    End {
        if (-not $List.Count) { return } # No jobs selected to search
        $PSBoundParameters[$Property] = $List
        [void]$PSBoundParameters.Remove('Force')
        [array]$ToRemove = Get-RSJob @PSBoundParameters
        if ($ToRemove.Count) {
            [System.Threading.Monitor]::Enter($PoshRS_Jobs.syncroot)
            try {
                $ToRemove | ForEach-Object {
                    If ($PSCmdlet.ShouldProcess("Name: $($_.Name), associated with JobID $($_.Id)",'Remove')) {
                        If ($_.State -notmatch 'Completed|Failed|Stopped') {
                            If ($Force) {
                                [void] $_.InnerJob.Stop()
                                $PoshRS_Jobs.Remove($_)
                            } Else {
                                Write-Error "Unable to remove job $($_.InstanceID)"
                            }
                        } Else {
                            [void]$PoshRS_Jobs.Remove($_)
                        }
                    }
                }
            }
            finally {
                [System.Threading.Monitor]::Exit($PoshRS_Jobs.syncroot)
            }
        }
    }
}