From 604ff417bf85d5da450e8d50b7d03aa4d4580737 Mon Sep 17 00:00:00 2001 From: freedbygrace Date: Fri, 20 Oct 2023 13:08:40 -0400 Subject: [PATCH] Update README.md --- README.md | 770 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 585 insertions(+), 185 deletions(-) diff --git a/README.md b/README.md index c9ccafe..0881d9a 100644 --- a/README.md +++ b/README.md @@ -1,246 +1,646 @@ +--- +external help file: -help.xml +Module Name: +online version: +schema: 2.0.0 +--- + # Invoke-PSThread - .SYNOPSIS - Enables the ability to leverage multithreading within powershell whilst reducing the complexity to get started. - - .DESCRIPTION - This function aims to remove the enormous complexity out of multithreading within powershell. See the fully working examples below. - - .PARAMETER Runspace - Your parameter description - .PARAMETER RunspacePool - Your parameter description +## SYNOPSIS - .PARAMETER Await - Your parameter description +Enables the ability to leverage multithreading within powershell whilst reducing the complexity to get started. - .PARAMETER RunspaceDefinition - Your parameter description +## SYNTAX - .PARAMETER RunspaceParameters - Your parameter description +### Runspace (Default) - .PARAMETER InputObjectList - Your parameter description +``` +Invoke-PSThread -RunspaceDefinition [-ApartmentState ] [-AssemblyList ] [-Confirm] [-ContinueOnError] [-FunctionList ] [-ModuleList ] [-Runspace] [-RunspaceParameters ] [-SynchronizedHashtable ] [-ThreadOption ] [-VariableList ] [-WaitForAvailableRunspace] [-WhatIf] [] +``` - .PARAMETER SynchronizedHashtable - Your parameter description +### RunspacePool - .PARAMETER AssemblyList - Your parameter description +``` +Invoke-PSThread -InputObjectList -RunspaceDefinition [-ApartmentState ] [-AssemblyList ] [-Confirm] [-ContinueOnError] [-FunctionList ] [-MaximumRunspaces ] [-ModuleList ] [-RunspaceParameters ] [-RunspacePool] [-SynchronizedHashtable ] [-ThreadOption ] [-VariableList ] [-WaitForAvailableRunspace] [-WhatIf] [] +``` - .PARAMETER FunctionList - Your parameter description +### Await - .PARAMETER ModuleList - Your parameter description +``` +Invoke-PSThread -ThreadList [-Await] [-Confirm] [-ContinueOnError] [-LoopDuration ] [-LoopTimeout ] [-WaitForAvailableRunspace] [-WhatIf] [] +``` - .PARAMETER VariableList - Your parameter description +## DESCRIPTION - .PARAMETER ThreadList - Your parameter description +This function aims to remove the enormous complexity out of multithreading within powershell. +See the fully working examples below. - .PARAMETER LoopTimeout - Your parameter description - .PARAMETER LoopDuration - Your parameter description +## EXAMPLES - .PARAMETER WaitForAvailableRunspace - Your parameter description +### Example 1: EXAMPLE 1 - .PARAMETER ContinueOnError - Your parameter description - - .EXAMPLE - Create a runspace +``` +Create a runspace +``` - [ScriptBlock]$RunspaceDefinition = { - Param - ( - $SynchronizedHashtable, - $Title, - $Message - ) - - $Null = Add-Type -AssemblyName 'System.Windows.Forms' - $Null = Add-Type -AssemblyName 'System.Drawing' +[ScriptBlock]$RunspaceDefinition = { + Param + ( + $SynchronizedHashtable, + $Title, + $Message + ) + + $Null = Add-Type -AssemblyName 'System.Windows.Forms' + $Null = Add-Type -AssemblyName 'System.Drawing' - $Form = New-Object -TypeName 'System.Windows.Forms.Form' - $Form.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList @(300,150) - - $TextBox = New-Object -TypeName 'System.Windows.Forms.RichTextBox' - $TextBox.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList @(110,50) - $TextBox.BorderStyle = 0 - $TextBox.BackColor = $Form.BackColor + $Form = New-Object -TypeName 'System.Windows.Forms.Form' + $Form.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList @(300,150) + + $TextBox = New-Object -TypeName 'System.Windows.Forms.RichTextBox' + $TextBox.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList @(110,50) + $TextBox.BorderStyle = 0 + $TextBox.BackColor = $Form.BackColor - $TextBox.Text = $Message + $TextBox.Text = $Message - $Null = $Form.Controls.Add($TextBox) + $Null = $Form.Controls.Add($TextBox) - $Null = $Form.ShowDialog() - } + $Null = $Form.ShowDialog() + } - $SynchronizedHashtable = [System.Collections.Hashtable]::Synchronized(@{}) - $SynchronizedHashtable.ThreadIDList = New-Object -TypeName 'System.Collections.Generic.List[System.String]' +$SynchronizedHashtable = [System.Collections.Hashtable]::Synchronized(@{}) + $SynchronizedHashtable.ThreadIDList = New-Object -TypeName 'System.Collections.Generic.List[System.String]' - $InvokePSThreadParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' - $InvokePSThreadParameters.Runspace = $True - $InvokePSThreadParameters.RunspaceDefinition = $RunspaceDefinition - $InvokePSThreadParameters.RunspaceParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' - $InvokePSThreadParameters.RunspaceParameters.Title = "This is my UI title" - $InvokePSThreadParameters.RunspaceParameters.Message = "This is my UI message.`r`nThis is the second line of my UI message.`r`nThis is the third line of my UI message." - $InvokePSThreadParameters.SynchronizedHashtable = Get-Variable -Name 'SynchronizedHashtable' -ErrorAction SilentlyContinue - $InvokePSThreadParameters.FunctionList = Get-ChildItem -Path 'Function:' | Where-Object {($_.Name -iin @('Test'))} - $InvokePSThreadParameters.ModuleList = Get-Module | Where-Object {($_.Name -iin @('Test'))} - $InvokePSThreadParameters.VariableList = Get-Variable | Where-Object {($_.Name -iin @('Test'))} - $InvokePSThreadParameters.ContinueOnError = $False - $InvokePSThreadParameters.Verbose = $True +$InvokePSThreadParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' + $InvokePSThreadParameters.Runspace = $True + $InvokePSThreadParameters.RunspaceDefinition = $RunspaceDefinition + $InvokePSThreadParameters.RunspaceParameters = [Ordered]@{} + $InvokePSThreadParameters.RunspaceParameters.Title = "This is my UI title" + $InvokePSThreadParameters.RunspaceParameters.Message = "This is my UI message.`r`nThis is the second line of my UI message.`r`nThis is the third line of my UI message." + $InvokePSThreadParameters.SynchronizedHashtable = Get-Variable -Name 'SynchronizedHashtable' -ErrorAction SilentlyContinue + $InvokePSThreadParameters.FunctionList = Get-ChildItem -Path 'Function:' | Where-Object {($_.Name -iin @('Test'))} + $InvokePSThreadParameters.ModuleList = Get-Module | Where-Object {($_.Name -iin @('Test'))} + $InvokePSThreadParameters.VariableList = Get-Variable | Where-Object {($_.Name -iin @('Test'))} + $InvokePSThreadParameters.ContinueOnError = $False + $InvokePSThreadParameters.Verbose = $True - $InvokePSThreadResult = Invoke-PSThread @InvokePSThreadParameters +$InvokePSThreadResult = Invoke-PSThread @InvokePSThreadParameters - Write-Output -InputObject ($InvokePSThreadResult) +Write-Output -InputObject ($InvokePSThreadResult) - .EXAMPLE - Create a runspace pool, submit all jobs to the pool, and the pool will manage their execution. - [ScriptBlock]$RunspaceDefinition = { - Param - ( - $InputObjectListItem, - $SynchronizedHashtable, - $AdditionalParameter1, - $AdditionalParameter2 - ) - #Set thread priority - [System.Threading.Thread]::CurrentThread.Priority = [System.Threading.ThreadPriority]::Lowest - - $ThreadInfo = [System.Threading.Thread]::CurrentThread - $ThreadID = [System.AppDomain]::GetCurrentThreadId() - $SynchronizedHashtable.ThreadIDList.Add($ThreadID) +### Example 2: EXAMPLE 2 - Write-Verbose -Message "Attempting to begin thread ID `"$($ThreadID)`". Please Wait..." -Verbose +``` +Create a runspace pool, submit all jobs to the pool, and the pool will manage their execution. +``` - $SynchronizedHashtable.Add("Thread$($ThreadID)", (Get-Date)) - - Write-Output -InputObject ($InputObjectListItem) +[ScriptBlock]$RunspaceDefinition = { + Param + ( + $InputObjectListItem, + $SynchronizedHashtable, + $AdditionalParameter1, + $AdditionalParameter2 + ) - Write-Output -InputObject ($AdditionalParameter1) + #Set thread priority + [System.Threading.Thread]::CurrentThread.Priority = [System.Threading.ThreadPriority]::Lowest + + $ThreadInfo = [System.Threading.Thread]::CurrentThread - Write-Output -InputObject ($AdditionalParameter2) + $ThreadID = [System.AppDomain]::GetCurrentThreadId() - $Null = Start-Sleep -Seconds (Get-Random -Minimum 10 -Maximum 25) - } + $SynchronizedHashtable.ThreadIDList.Add($ThreadID) - $SynchronizedHashtable = [System.Collections.Hashtable]::Synchronized(@{}) - $SynchronizedHashtable.ThreadIDList = New-Object -TypeName 'System.Collections.Generic.List[System.String]' + Write-Verbose -Message "Attempting to begin thread ID `"$($ThreadID)`". +Please Wait..." -Verbose - $InvokePSThreadParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' - $InvokePSThreadParameters.RunspacePool = $True - $InvokePSThreadParameters.InputObjectList = 1..15 - $InvokePSThreadParameters.RunspaceDefinition = $RunspaceDefinition - $InvokePSThreadParameters.RunspaceParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' - $InvokePSThreadParameters.RunspaceParameters.AdditionalParameter1 = Get-Random -Minimum 0 -Maximum 10000 - $InvokePSThreadParameters.RunspaceParameters.AdditionalParameter2 = Get-Random -Minimum 0 -Maximum 10000 - $InvokePSThreadParameters.SynchronizedHashtable = Get-Variable -Name 'SynchronizedHashtable' -ErrorAction SilentlyContinue - $InvokePSThreadParameters.FunctionList = Get-ChildItem -Path 'Function:' | Where-Object {($_.Name -iin @('Test'))} - $InvokePSThreadParameters.ModuleList = Get-Module | Where-Object {($_.Name -iin @('Test'))} - $InvokePSThreadParameters.VariableList = Get-Variable | Where-Object {($_.Name -iin @('Test'))} - $InvokePSThreadParameters.ContinueOnError = $False - $InvokePSThreadParameters.Verbose = $True + $SynchronizedHashtable.Add("Thread$($ThreadID)", (Get-Date)) + + Write-Output -InputObject ($InputObjectListItem) - $InvokePSThreadResult = Invoke-PSThread @InvokePSThreadParameters + Write-Output -InputObject ($AdditionalParameter1) - Write-Output -InputObject ($InvokePSThreadResult) + Write-Output -InputObject ($AdditionalParameter2) - .EXAMPLE - Create a runspace pool, submit all jobs to the pool, and the pool will manage their execution. The function will be executed a second time to wait until all jobs have been completed, return their output, and cleanup. + $Null = Start-Sleep -Seconds (Get-Random -Minimum 10 -Maximum 25) + } - [ScriptBlock]$RunspaceDefinition = { - Param - ( - $InputObjectListItem, - $SynchronizedHashtable, - $AdditionalParameter1, - $AdditionalParameter2 - ) +$SynchronizedHashtable = [System.Collections.Hashtable]::Synchronized(@{}) + $SynchronizedHashtable.ThreadIDList = New-Object -TypeName 'System.Collections.Generic.List[System.String]' - #Set thread priority - [System.Threading.Thread]::CurrentThread.Priority = [System.Threading.ThreadPriority]::Lowest - - $ThreadInfo = [System.Threading.Thread]::CurrentThread +$InvokePSThreadParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' + $InvokePSThreadParameters.RunspacePool = $True + $InvokePSThreadParameters.InputObjectList = 1..15 + $InvokePSThreadParameters.RunspaceDefinition = $RunspaceDefinition + $InvokePSThreadParameters.RunspaceParameters = [Ordered]@{} + $InvokePSThreadParameters.RunspaceParameters.AdditionalParameter1 = Get-Random -Minimum 0 -Maximum 10000 + $InvokePSThreadParameters.RunspaceParameters.AdditionalParameter2 = Get-Random -Minimum 0 -Maximum 10000 + $InvokePSThreadParameters.SynchronizedHashtable = Get-Variable -Name 'SynchronizedHashtable' -ErrorAction SilentlyContinue + $InvokePSThreadParameters.FunctionList = Get-ChildItem -Path 'Function:' | Where-Object {($_.Name -iin @('Test'))} + $InvokePSThreadParameters.ModuleList = Get-Module | Where-Object {($_.Name -iin @('Test'))} + $InvokePSThreadParameters.VariableList = Get-Variable | Where-Object {($_.Name -iin @('Test'))} + $InvokePSThreadParameters.ContinueOnError = $False + $InvokePSThreadParameters.Verbose = $True - $ThreadID = [System.AppDomain]::GetCurrentThreadId() +$InvokePSThreadResult = Invoke-PSThread @InvokePSThreadParameters - $SynchronizedHashtable.ThreadIDList.Add($ThreadID) +Write-Output -InputObject ($InvokePSThreadResult) - Write-Verbose -Message "Attempting to begin thread ID `"$($ThreadID)`". Please Wait..." -Verbose - $SynchronizedHashtable.Add("Thread$($ThreadID)", (Get-Date)) - - Write-Output -InputObject ($InputObjectListItem) - Write-Output -InputObject ($AdditionalParameter1) - Write-Output -InputObject ($AdditionalParameter2) - $Null = Start-Sleep -Seconds (Get-Random -Minimum 10 -Maximum 25) - } - - $SynchronizedHashtable = [System.Collections.Hashtable]::Synchronized(@{}) - $SynchronizedHashtable.ThreadIDList = New-Object -TypeName 'System.Collections.Generic.List[System.String]' +### Example 3: EXAMPLE 3 - $InvokePSThreadParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' - $InvokePSThreadParameters.RunspacePool = $True - $InvokePSThreadParameters.InputObjectList = Get-Process | Get-Random -Count 15 - $InvokePSThreadParameters.RunspaceDefinition = $RunspaceDefinition - $InvokePSThreadParameters.RunspaceParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' - $InvokePSThreadParameters.RunspaceParameters.AdditionalParameter1 = Get-Random -Minimum 0 -Maximum 10000 - $InvokePSThreadParameters.RunspaceParameters.AdditionalParameter2 = Get-Random -Minimum 0 -Maximum 10000 - $InvokePSThreadParameters.SynchronizedHashtable = Get-Variable -Name 'SynchronizedHashtable' -ErrorAction SilentlyContinue - $InvokePSThreadParameters.FunctionList = Get-ChildItem -Path 'Function:' | Where-Object {($_.Name -iin @('Test'))} - $InvokePSThreadParameters.ModuleList = Get-Module | Where-Object {($_.Name -iin @('Test'))} - $InvokePSThreadParameters.VariableList = Get-Variable | Where-Object {($_.Name -iin @('Test'))} - $InvokePSThreadParameters.ContinueOnError = $False - $InvokePSThreadParameters.Verbose = $True +``` +Create a runspace pool, submit all jobs to the pool, and the pool will manage their execution. The function will be executed a second time to wait until all jobs have been completed, return their output, and cleanup. +``` - $InvokePSThreadResult = Invoke-PSThread @InvokePSThreadParameters +[ScriptBlock]$RunspaceDefinition = { + Param + ( + $InputObjectListItem, + $SynchronizedHashtable, + $AdditionalParameter1, + $AdditionalParameter2 + ) - #Do some additional work here before beginning to wait for your runspace pool to be completed. + #Set thread priority + [System.Threading.Thread]::CurrentThread.Priority = [System.Threading.ThreadPriority]::Lowest + + $ThreadInfo = [System.Threading.Thread]::CurrentThread - $InvokePSThreadParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' - $InvokePSThreadParameters.Await = $True - $InvokePSThreadParameters.ThreadList = $InvokePSThreadResult - $InvokePSThreadParameters.LoopTimeout = [System.TimeSpan]::FromHours(1) - $InvokePSThreadParameters.LoopDuration = [System.TimeSpan]::FromMilliseconds(15000) - $InvokePSThreadParameters.ContinueOnError = $False - $InvokePSThreadParameters.Verbose = $True + $ThreadID = [System.AppDomain]::GetCurrentThreadId() - $ThreadAwaitResult = Invoke-PSThread @InvokePSThreadParameters + $SynchronizedHashtable.ThreadIDList.Add($ThreadID) - Write-Output -InputObject ($ThreadAwaitResult) + Write-Verbose -Message "Attempting to begin thread ID `"$($ThreadID)`". +Please Wait..." -Verbose - .NOTES - Any useful tidbits + $SynchronizedHashtable.Add("Thread$($ThreadID)", (Get-Date)) + + Write-Output -InputObject ($InputObjectListItem) - .LINK - https://davewyatt.wordpress.com/2014/04/29/more-potential-use-cases-for-thread-safe-variable-access-in-powershell-events/ + Write-Output -InputObject ($AdditionalParameter1) - .LINK - https://davewyatt.wordpress.com/2014/04/29/more-potential-use-cases-for-thread-safe-variable-access-in-powershell-events/ + Write-Output -InputObject ($AdditionalParameter2) - .LINK - https://www.codeproject.com/Tips/895840/Multi-Threaded-PowerShell-Cookbook + $Null = Start-Sleep -Seconds (Get-Random -Minimum 10 -Maximum 25) + } - .LINK - https://www.linkedin.com/pulse/multithreading-powershell-scripts-alexey/ - - .LINK - https://xkln.net/blog/multithreading-in-powershell--running-a-specific-number-of-threads/ +$SynchronizedHashtable = [System.Collections.Hashtable]::Synchronized(@{}) + $SynchronizedHashtable.ThreadIDList = New-Object -TypeName 'System.Collections.Generic.List[System.String]' + +$InvokePSThreadParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' + $InvokePSThreadParameters.RunspacePool = $True + $InvokePSThreadParameters.InputObjectList = Get-Process | Get-Random -Count 15 + $InvokePSThreadParameters.RunspaceDefinition = $RunspaceDefinition + $InvokePSThreadParameters.RunspaceParameters = [Ordered]@{} + $InvokePSThreadParameters.RunspaceParameters.AdditionalParameter1 = Get-Random -Minimum 0 -Maximum 10000 + $InvokePSThreadParameters.RunspaceParameters.AdditionalParameter2 = Get-Random -Minimum 0 -Maximum 10000 + $InvokePSThreadParameters.SynchronizedHashtable = Get-Variable -Name 'SynchronizedHashtable' -ErrorAction SilentlyContinue + $InvokePSThreadParameters.FunctionList = Get-ChildItem -Path 'Function:' | Where-Object {($_.Name -iin @('Test'))} + $InvokePSThreadParameters.ModuleList = Get-Module | Where-Object {($_.Name -iin @('Test'))} + $InvokePSThreadParameters.VariableList = Get-Variable | Where-Object {($_.Name -iin @('Test'))} + $InvokePSThreadParameters.ContinueOnError = $False + $InvokePSThreadParameters.Verbose = $True + +$InvokePSThreadResult = Invoke-PSThread @InvokePSThreadParameters + +#Do some additional work here before beginning to wait for your runspace pool to be completed. + +$InvokePSThreadParameters = New-Object -TypeName 'System.Collections.Specialized.OrderedDictionary' + $InvokePSThreadParameters.Await = $True + $InvokePSThreadParameters.ThreadList = $InvokePSThreadResult + $InvokePSThreadParameters.LoopTimeout = [System.TimeSpan]::FromHours(1) + $InvokePSThreadParameters.LoopDuration = [System.TimeSpan]::FromMilliseconds(15000) + $InvokePSThreadParameters.ContinueOnError = $False + $InvokePSThreadParameters.Verbose = $True + +$ThreadAwaitResult = Invoke-PSThread @InvokePSThreadParameters + +Write-Output -InputObject ($ThreadAwaitResult) + + + + + + +## PARAMETERS + +### -ApartmentState + +A valid apartment state that will be used to create each thread within the runspace. + +```yaml +Type: ApartmentState +Parameter Sets: RunspacePool, Runspace +Aliases: AS +Accepted values: + +Required: True (None) False (RunspacePool, Runspace) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -AssemblyList + +A list of one or more additional assemblies that will be loaded into the inital session state, and made available to each thread. + +```yaml +Type: SessionStateAssemblyEntry[] +Parameter Sets: RunspacePool, Runspace +Aliases: AL +Accepted values: + +Required: True (None) False (RunspacePool, Runspace) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -Await + +Strictly places this function into "Await" mode. + +```yaml +Type: SwitchParameter +Parameter Sets: Await +Aliases: AW +Accepted values: + +Required: True (None) False (Await) +Position: Named +Default value: False +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -Confirm + +{{ Fill Confirm Description }} + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: cf +Accepted values: + +Required: True (None) False (All) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -ContinueOnError + +Ignore errors. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: COE +Accepted values: + +Required: True (None) False (All) +Position: Named +Default value: False +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -FunctionList + +A list of one or more additional functions that will be loaded into the inital session state, and made available to each thread. + +```yaml +Type: FunctionInfo[] +Parameter Sets: RunspacePool, Runspace +Aliases: FL +Accepted values: + +Required: True (None) False (RunspacePool, Runspace) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -InputObjectList + +A list of one or more objects to submit to the runspace pool. +The runspace pool will create a job for each item and process them in a queue fashion (As new runspaces become available) until the list has been completed. + +```yaml +Type: Object[] +Parameter Sets: RunspacePool +Aliases: IOL +Accepted values: + +Required: True (RunspacePool) False (None) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -LoopDuration + +A valid timespan that will be used for designating how often to recheck the status of running threads. + +```yaml +Type: TimeSpan +Parameter Sets: Await +Aliases: LD +Accepted values: + +Required: True (None) False (Await) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -LoopTimeout + +A valid timespan that will be used for designating the maximum time allowed to monitor running threads. + +```yaml +Type: TimeSpan +Parameter Sets: Await +Aliases: LT +Accepted values: + +Required: True (None) False (Await) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -MaximumRunspaces + +The maximum runspaces available to the runspace pool. +By default, the value will be set to double the amount of logical processors available to the current device. + +```yaml +Type: UInt32 +Parameter Sets: RunspacePool +Aliases: MR +Accepted values: + +Required: True (None) False (RunspacePool) +Position: Named +Default value: 0 +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -ModuleList + +A list of one or more additional modules that will be loaded into the inital session state, and made available to each thread. + +```yaml +Type: PSModuleInfo[] +Parameter Sets: RunspacePool, Runspace +Aliases: ML +Accepted values: + +Required: True (None) False (RunspacePool, Runspace) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -Runspace + +Strictly places this function into "Runspace" mode. + +```yaml +Type: SwitchParameter +Parameter Sets: Runspace +Aliases: RS +Accepted values: + +Required: True (None) False (Runspace) +Position: Named +Default value: False +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -RunspaceDefinition + +A valid scriptblock that will be executed by either a single thread within the runspace, or by each thread within the runspace pool. + +```yaml +Type: ScriptBlock +Parameter Sets: RunspacePool, Runspace +Aliases: RD +Accepted values: + +Required: True (RunspacePool, Runspace) False (None) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -RunspaceParameters + +A valid hashtable containing the key-value pairs for the additional parameters to be passed to each thread. +If the order of the parameters needs to be preserved, use an ordered hashtable instead. + +```yaml +Type: Hashtable +Parameter Sets: RunspacePool, Runspace +Aliases: RSP +Accepted values: + +Required: True (None) False (RunspacePool, Runspace) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -RunspacePool + +Strictly places this function into "RunspacePool" mode. + +```yaml +Type: SwitchParameter +Parameter Sets: RunspacePool +Aliases: RP +Accepted values: + +Required: True (None) False (RunspacePool) +Position: Named +Default value: False +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -SynchronizedHashtable + +A valid variable object that contains the synchronized hashtable. +This is primarily used to share data between the main thread, and any additional threads that are created. + +```yaml +Type: PSVariable +Parameter Sets: RunspacePool, Runspace +Aliases: SHT +Accepted values: + +Required: True (None) False (RunspacePool, Runspace) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -ThreadList + +A list of one ore more objects that were returned in the output from a previous call of this function. +The runspaces in this list will be monitored until they have completed. + +```yaml +Type: PSObject[] +Parameter Sets: Await +Aliases: TL +Accepted values: + +Required: True (Await) False (None) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -ThreadOption + +A valid thread option that will be used to create each thread within the runspace. + +```yaml +Type: PSThreadOptions +Parameter Sets: RunspacePool, Runspace +Aliases: TO +Accepted values: + +Required: True (None) False (RunspacePool, Runspace) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -VariableList + +A list of one or more additional variables that will be loaded into the inital session state, and made available to each thread. + +```yaml +Type: PSVariable[] +Parameter Sets: RunspacePool, Runspace +Aliases: VL +Accepted values: + +Required: True (None) False (RunspacePool, Runspace) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -WaitForAvailableRunspace + +If there are no more available runspaces, the function will wait to submit any additional jobs to teh runspace pool as runspaces become available. +This will drastically increase the time it takes to process the runspace pool. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: WFAR +Accepted values: + +Required: True (None) False (All) +Position: Named +Default value: False +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + +### -WhatIf + +{{ Fill WhatIf Description }} + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: wi +Accepted values: + +Required: True (None) False (All) +Position: Named +Default value: +Accept pipeline input: False +Accept wildcard characters: False +DontShow: False +``` + + +### CommonParameters + +This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). + +## NOTES + +Any useful tidbits + + +## RELATED LINKS + +[] (https://davewyatt.wordpress.com/2014/04/29/more-potential-use-cases-for-thread-safe-variable-access-in-powershell-events/) + +[] (https://davewyatt.wordpress.com/2014/04/29/more-potential-use-cases-for-thread-safe-variable-access-in-powershell-events/) + +[] (https://www.codeproject.com/Tips/895840/Multi-Threaded-PowerShell-Cookbook) + +[] (https://www.linkedin.com/pulse/multithreading-powershell-scripts-alexey/) + +[] (https://xkln.net/blog/multithreading-in-powershell--running-a-specific-number-of-threads/) + +[] (https://markw.dev/#:~:text=There%20are%20two%20ways%20we,other%20is%20by%20using%20splatting.&text=The%20important%20part%20here%20is,plural)%20instead%20of%20AddParameter()%20.) - .LINK - https://markw.dev/#:~:text=There%20are%20two%20ways%20we,other%20is%20by%20using%20splatting.&text=The%20important%20part%20here%20is,plural)%20instead%20of%20AddParameter()%20.