functions/runspace/Start-PSFRunspace.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
function Start-PSFRunspace
{
<#
 .SYNOPSIS
  Starts a runspace that was registered to the PSFramework
  
 .DESCRIPTION
  Starts a runspace that was registered to the PSFramework
  Simply registering does not automatically start a given runspace. Only by executing this function will it take effect.
  
 .PARAMETER Name
  The name of the registered runspace to launch
  
 .PARAMETER Runspace
  The runspace to launch. Returned by Get-PSFRunspace
  
 .PARAMETER NoMessage
  Setting this will prevent messages be written to the message / logging system.
  This is designed to make the PSFramework not flood the log on each import.
  
 .PARAMETER EnableException
  This parameters disables user-friendly warnings and enables the throwing of exceptions.
  This is less user friendly, but allows catching exceptions in calling scripts.
  
 .PARAMETER Confirm
  If this switch is enabled, you will be prompted for confirmation before executing any operations that change state.
 
 .PARAMETER WhatIf
  If this switch is enabled, no actions are performed but informational messages will be displayed that explain what would happen if the command were to run.
  
 .EXAMPLE
  PS C:\> Start-PSFRunspace -Name 'mymodule.maintenance'
   
  Starts the runspace registered under the name 'mymodule.maintenance'
#>

    [CmdletBinding(SupportsShouldProcess = $true)]
    Param (
        [Parameter(ValueFromPipeline = $true)]
        [string[]]
        $Name,
        
        [Parameter(ValueFromPipeline = $true)]
        [PSFramework.Runspace.RunspaceContainer[]]
        $Runspace,
        
        [switch]
        $NoMessage,
        
        [switch]
        $EnableException
    )
    
    process
    {
        foreach ($item in $Name)
        {
            # Ignore all output from Get-PSFRunspace - it'll be handled by the second loop
            if ($item -eq "psframework.runspace.runspacecontainer") { continue }
            
            if ([PSFramework.Runspace.RunspaceHost]::Runspaces.ContainsKey($item.ToLower()))
            {
                if ($PSCmdlet.ShouldProcess($item, "Starting Runspace"))
                {
                    try
                    {
                        if (-not $NoMessage) { Write-PSFMessage -Level Verbose -Message "Starting runspace: <c='em'>$($item.ToLower())</c>" -Target $item.ToLower() -Tag "runspace", "start" }
                        [PSFramework.Runspace.RunspaceHost]::Runspaces[$item.ToLower()].Start()
                    }
                    catch
                    {
                        Stop-PSFFunction -Message "Failed to start runspace: <c='em'>$($item.ToLower())</c>" -ErrorRecord $_ -EnableException $EnableException -Tag "fail", "argument", "runspace", "start" -Target $item.ToLower() -Continue
                    }
                }
            }
            else
            {
                Stop-PSFFunction -Message "Failed to start runspace: <c='em'>$($item.ToLower())</c> | No runspace registered under this name!" -EnableException $EnableException -Category InvalidArgument -Tag "fail", "argument", "runspace", "start" -Target $item.ToLower() -Continue
            }
        }
        
        foreach ($item in $Runspace)
        {
            if ($PSCmdlet.ShouldProcess($item.Name, "Starting Runspace"))
            {
                try
                {
                    if (-not $NoMessage) { Write-PSFMessage -Level Verbose -Message "Starting runspace: <c='em'>$($item.Name.ToLower())</c>" -Target $item -Tag "runspace", "start" }
                    $item.Start()
                }
                catch
                {
                    Stop-PSFFunction -Message "Failed to start runspace: <c='em'>$($item.Name.ToLower())</c>" -EnableException $EnableException -Tag "fail", "argument", "runspace", "start" -Target $item -Continue
                }
            }
        }
    }
}