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
Categories: