Last active
July 18, 2022 05:27
-
-
Save ConnerWill/4c926542aef886be86b0a3bdcd17b15e to your computer and use it in GitHub Desktop.
powershell resources
PowerShell-templates-snipets.md
# Create a new PSCustomObject
$Result = [pscustomobject] @{
Result1 = $Result1
Result2 = $Result2
}
Return $Result
###################################################################################################
# Array with PSCustomObject
[System.Collections.ArrayList]$Results = @()
foreach($Item in $Items)
{
$Result = [pscustomobject] @{
Result1 = $Item.Result1
Result2 = $Item.Result2
}
[void]$Results.Add($Result)
}
Return $Results
Module Availability Reference
Reference material is organized into release versions. The content for each version is organized by module name, and a distinct folder for the about topics.
Over time, namespaces appeared as:
Module Name / PS Version | 5.1 | 7.0 | 7.2 | 7.3 |
---|---|---|---|---|
CimCmdlets | X | X | X | X |
ISE (introduced in 2.0) | X | |||
Microsoft.PowerShell.Archive | X | X | X | X |
Microsoft.PowerShell.Core | X | X | X | X |
Microsoft.PowerShell.Diagnostics | X | X | X | X |
Microsoft.PowerShell.Host | X | X | X | X |
Microsoft.PowerShell.LocalAccounts | X | |||
Microsoft.PowerShell.Management | X | X | X | X |
Microsoft.PowerShell.ODataUtils | X | |||
Microsoft.PowerShell.Operation.Validation | X | |||
Microsoft.PowerShell.Security | X | X | X | X |
Microsoft.PowerShell.Utility | X | X | X | X |
Microsoft.WsMan.Management | X | X | X | X |
PackageManagement | X | X | X | X |
PowershellGet | X | X | X | X |
PSDesiredStateConfiguration | X | X | X | |
PSDiagnostics | X | X | X | X |
PSReadLine | X | X | X | X |
PSScheduledJob | X | |||
PSWorkflow | X | |||
PSWorkflowUtility | X | |||
ThreadJob | X | X | X |
══════════════════════════════════════════════
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################################################################################### | |
# Language : PowerShell 4.0 | |
# Filename : RunspacePool.ps1 | |
# Autor : BornToBeRoot (https://github.com/BornToBeRoot) | |
# Description : Template for RunspacePool to run code async | |
# Repository : https://github.com/BornToBeRoot/PowerShell | |
############################################################################################################### | |
<# | |
.SYNOPSIS | |
Template for RunspacePool to run code async | |
.DESCRIPTION | |
.EXAMPLE | |
.EXAMPLE | |
.LINK | |
https://github.com/BornToBeRoot/PowerShell | |
#> | |
[CmdletBinding()] | |
param( | |
# Number of concurrent threads --> depens on what code you are running / which hardware you are using | |
[Parameter( | |
Position=0, | |
HelpMessage='Maximum number of threads at the same time (Default=100)')] | |
[Int32]$Threads=100 | |
) | |
Begin{ | |
} | |
Process{ | |
### Scriptblock (this code will run asynchron in the RunspacePool) | |
[System.Management.Automation.ScriptBlock]$ScriptBlock = { | |
Param( | |
### ScriptBlock Parameter | |
$Parameter1, | |
$Parameter2 | |
) | |
####################################### | |
## Enter | |
## code | |
## here, | |
## which | |
## should | |
## run | |
## asynchron | |
####################################### | |
### Built custom PSObject and return it | |
[pscustomobject] @{ | |
Parameter1 = Result1 | |
Parameter2 = Result2 | |
} | |
} | |
# Create RunspacePool and Jobs | |
Write-Verbose "Setting up RunspacePool..." | |
Write-Verbose "Running with max $Threads threads" | |
$RunspacePool = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspacePool(1, $Threads, $Host) | |
$RunspacePool.Open() | |
[System.Collections.ArrayList]$Jobs = @() | |
Write-Verbose "Setting up Jobs..." | |
# Setting up jobs | |
for($i = $StartRange; $i -le $EndRange; $i++) | |
{ | |
# Hashtable to pass parameters | |
$ScriptParams = @{ | |
Parameter1 = $Parameter1 | |
Parameter2 = $Parameter2 | |
} | |
# Catch when trying to divide through zero | |
try { | |
$Progress_Percent = ($i / ($EndRange - $StartRange)) * 100 # Calulate some percent | |
} | |
catch { | |
$Progress_Percent = 100 | |
} | |
Write-Progress -Activity "Setting up jobs..." -Id 1 -Status "Current Job: $i" -PercentComplete ($Progress_Percent) | |
# Create mew job | |
$Job = [System.Management.Automation.PowerShell]::Create().AddScript($ScriptBlock).AddParameters($ScriptParams) | |
$Job.RunspacePool = $RunspacePool | |
$JobObj = [pscustomobject] @{ | |
RunNum = $i - $StartRange | |
Pipe = $Job | |
Result = $Job.BeginInvoke() | |
} | |
# Add job to collection | |
[void]$Jobs.Add($JobObj) | |
} | |
Write-Verbose "Waiting for jobs to complete & starting to process results..." | |
# Total jobs to calculate percent complete, because jobs are removed after they are processed | |
$Jobs_Total = $Jobs.Count | |
# Process results, while waiting for other jobs | |
Do { | |
# Get all jobs, which are completed | |
$Jobs_ToProcess = $Jobs | Where-Object {$_.Result.IsCompleted} | |
# If no jobs finished yet, wait 500 ms and try again | |
if($Jobs_ToProcess -eq $null) | |
{ | |
Write-Verbose "No jobs completed, wait 500ms..." | |
Start-Sleep -Milliseconds 500 | |
continue | |
} | |
# Get jobs, which are not complete yet | |
$Jobs_Remaining = ($Jobs | Where-Object {$_.Result.IsCompleted -eq $false}).Count | |
# Catch when trying to divide through zero | |
try { | |
$Progress_Percent = 100 - (($Jobs_Remaining / $Jobs_Total) * 100) | |
} | |
catch { | |
$Progress_Percent = 100 | |
} | |
Write-Progress -Activity "Waiting for jobs to complete... ($($Threads - $($RunspacePool.GetAvailableRunspaces())) of $Threads threads running)" -Id 1 -PercentComplete $Progress_Percent -Status "$Jobs_Remaining remaining..." | |
Write-Verbose "Processing $(if($Jobs_ToProcess.Count -eq $null){"1"}else{$Jobs_ToProcess.Count}) job(s)..." | |
# Processing completed jobs | |
foreach($Job in $Jobs_ToProcess) | |
{ | |
# Get the result... | |
$Job_Result = $Job.Pipe.EndInvoke($Job.Result) | |
$Job.Pipe.Dispose() | |
# Remove job from collection | |
$Jobs.Remove($Job) | |
# Check if result is null --> if not, return it | |
if($Job_Result -ne $null) | |
{ | |
$Job_Result | |
} | |
} | |
} While ($Jobs.Count -gt 0) | |
Write-Verbose "Closing RunspacePool and free resources..." | |
# Close the RunspacePool and free resources | |
$RunspacePool.Close() | |
$RunspacePool.Dispose() | |
} | |
End{ | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment