#Running batches as jobs


function Get-PCBatchJob{

    [CmdletBinding()]
    param (
        $Computers,
        [switch]$printers
    )
    $TotalItems = $Computers.count
    $ActiveJobs = @()
    $itemIndex = 0
    foreach ($c in $computers){
        
        if($printers){
            JobsProgressBar $c $itemIndex $TotalItems 1
            $ActiveJobs += Start-Job -Name $c -ScriptBlock ${function:Get-SHSPrinter} -ArgumentList $c
        }
        else{
            JobsProgressBar $c $itemIndex $TotalItems 1
            $ActiveJobs += Start-Job -Name $c -ScriptBlock ${function:get-pc} -ArgumentList $c
        }
        $itemIndex++
    }

    $completedJobs = @()
    $itemIndex = 0
    JobsProgressBar 'Waiting on jobs to be' $itemIndex $TotalItems 2
    While($ActiveJobs.Length){
        $job = Wait-Job -Any $ActiveJobs
        $itemIndex++
        JobsProgressBar $job.Name $itemIndex $TotalItems 2
        $completedJobs += $job            
        $ActiveJobs = $ActiveJobs | Where-Object { $_.Name -ne $job.Name }
    }
    $itemIndex = 0
    foreach($job in $completedJobs) {
        $itemIndex++
        JobsProgressBar $job.Name $itemIndex $TotalItems 3
        $output = Receive-Job $job | Select-Object * -ExcludeProperty RunspaceId, PSComputerName, PSShowComputerName
        Remove-job $job
        Write-Output $output
    }
}

function JobsProgressBar {
    param (
        $item,
        $currentItemIndex,
        $TotalItems,
        $stage
    )
    switch ($stage) {
        1 { Write-Progress -Activity "Starting Jobs" -Status "$item Job Started ($currentItemIndex/$TotalItems)" -PercentComplete (($currentItemIndex/$TotalItems) * 100)}
        2 { Write-Progress -Activity "Jobs Running" -Status "$item Completed ($currentItemIndex/$TotalItems)" -PercentComplete (($currentItemIndex/$TotalItems) * 100)}
        3 { Write-Progress -Activity "Retrieving Data" -Status "$item Completed ($currentItemIndex/$TotalItems)" -PercentComplete (($currentItemIndex/$TotalItems) * 100)}
        Default {}
    }

}