Posted On October 3, 2020

How To Invoke Functions as Background Jobs

kimconnect 0 comments
blog.KimConnect.com >> Codes >> How To Invoke Functions as Background Jobs

Invoke-Command, Start-Job, Multi-Tasking is what good coders should aspire toward. Here, we’re looking at some useful methods to make our programs more efficient.

# Demo 2: This is a more advanced technique to perform simultaneous tasking on multiple computers by invoking functions remotely

$computernames='computer1','computer2','computer3'
    foreach ($computerName in $computerNames){
        Start-Job -name $computerName -InitializationScript $functions -ScriptBlock {param($computer,$something);pingFrom $computer $something} -Args $computerName,'google.com'
    }
    get-job|?{$_.HasMoreData -eq $false -and $_.State -eq 'Completed'}|remove-job
    $jobResults=@()
    do{
        $completedJobs=get-job|?{$_.HasMoreData -eq $true -and $_.State -eq 'Completed'}
        foreach ($job in $completedJobs){
            $minutesElapsed=[math]::round(($job.PSEndTime-$job.PSBeginTime).TotalMinutes,2)
            $computer=$job.Name
            $result=receive-job -id $job.id
            $jobResults+=[pscustomobject]@{
                computerName=$computer
                minutesElapsed=$minutesElapsed
                result=$result
            }
            remove-job -id $job.id
        }
        sleep 1
    }until(!(get-job))
    $jobResults

# Sample output:
#PS C:\Windows\system32>     $jobResults
#computerName  minutesElapsed result
#------------  -------------- ------
#computer1      0.08        {, Pinging google.com [74.125.136.138] with 32 bytes of data:, Reply from 74.125.136.13...
#computer2      0.07        {, Pinging google.com [74.125.136.101] with 32 bytes of data:, Reply from 74.125.136.10...
#computer3      0.07        {, Pinging google.com [74.125.136.100] with 32 bytes of data:, Reply from 74.125.136.10...
# Demo 1: a simple illustration of how to pass functions into jobs

$functions = {
    function foo { write-host "bar" }
    function whoisthere {write-host "big bad wolf"}
    function pingSomething ($uri='amazon.com'){ping $uri}
}

Start-Job -InitializationScript $functions -ScriptBlock {foo}|wait-job|receive-job
Start-Job -InitializationScript $functions -ScriptBlock {whoisthere}|wait-job|receive-job
$job3=Start-Job -InitializationScript $functions -ScriptBlock {param($something);pingSomething $something} -Args 'google.com'
wait-job $job3|Receive-Job
Sample Output:
PS C:\Users\Dee> Start-Job -InitializationScript $functions -ScriptBlock {foo}|wait-job|receive-job
bar
PS C:\Users\Dee> Start-Job -InitializationScript $functions -ScriptBlock {whoisthere}|wait-job|receive-job
big bad wolf
PS C:\Users\Dee> $job3=Start-Job -InitializationScript $functions -ScriptBlock {param($something);pingSomething $something} -Args 'google.com'
PS C:\Users\Dee> wait-job $job3|Receive-Job
Pinging google.com [142.250.72.238] with 32 bytes of data:
Reply from 142.250.72.238: bytes=32 time=13ms TTL=115
Reply from 142.250.72.238: bytes=32 time=28ms TTL=115
Reply from 142.250.72.238: bytes=32 time=14ms TTL=115
Reply from 142.250.72.238: bytes=32 time=14ms TTL=115
Ping statistics for 142.250.72.238:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 13ms, Maximum = 28ms, Average = 17ms

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Post

Check Whether an Entity Has Access to a Directory or Its Children

Write-Host "This script just be ran in the context of a File Server Administrators member"…

PowerShell: DHCP Server Migration

Nowadays, being lazy is good. Why waste energy with clicking buttons when there are a…

Quick Script to Mount Remote UNC Paths as Local Drive Letters

Simple Mount: # Mapping a drive $username='domain\testAdmin' $password='PASSWORD' $remotePath='\\UNCSERVER\SHAREPATH\Backup' $unavailableDriveLetters=(Get-Volume).DriveLetter|sort $availableDriveLetters=.{(65..90|%{[char]$_})|?{$_ -notin $unavailableDriveLetters}} [char]$firstAvailableDriveLetter=$availableDriveLetters[0] $command="net…