mirror of
https://github.com/freedbygrace/Invoke-PSThread.git
synced 2026-07-26 11:28:14 +00:00
Update README.md
This commit is contained in:
@@ -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 <ScriptBlock> [-ApartmentState <ApartmentState>] [-AssemblyList <SessionStateAssemblyEntry[]>] [-Confirm] [-ContinueOnError] [-FunctionList <FunctionInfo[]>] [-ModuleList <PSModuleInfo[]>] [-Runspace] [-RunspaceParameters <Hashtable>] [-SynchronizedHashtable <PSVariable>] [-ThreadOption <PSThreadOptions>] [-VariableList <PSVariable[]>] [-WaitForAvailableRunspace] [-WhatIf] [<CommonParameters>]
|
||||
```
|
||||
|
||||
.PARAMETER SynchronizedHashtable
|
||||
Your parameter description
|
||||
### RunspacePool
|
||||
|
||||
.PARAMETER AssemblyList
|
||||
Your parameter description
|
||||
```
|
||||
Invoke-PSThread -InputObjectList <Object[]> -RunspaceDefinition <ScriptBlock> [-ApartmentState <ApartmentState>] [-AssemblyList <SessionStateAssemblyEntry[]>] [-Confirm] [-ContinueOnError] [-FunctionList <FunctionInfo[]>] [-MaximumRunspaces <UInt32>] [-ModuleList <PSModuleInfo[]>] [-RunspaceParameters <Hashtable>] [-RunspacePool] [-SynchronizedHashtable <PSVariable>] [-ThreadOption <PSThreadOptions>] [-VariableList <PSVariable[]>] [-WaitForAvailableRunspace] [-WhatIf] [<CommonParameters>]
|
||||
```
|
||||
|
||||
.PARAMETER FunctionList
|
||||
Your parameter description
|
||||
### Await
|
||||
|
||||
.PARAMETER ModuleList
|
||||
Your parameter description
|
||||
```
|
||||
Invoke-PSThread -ThreadList <PSObject[]> [-Await] [-Confirm] [-ContinueOnError] [-LoopDuration <TimeSpan>] [-LoopTimeout <TimeSpan>] [-WaitForAvailableRunspace] [-WhatIf] [<CommonParameters>]
|
||||
```
|
||||
|
||||
.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.
|
||||
|
||||
Reference in New Issue
Block a user