Quantcast
Channel: Windows PowerShell forum
Viewing all articles
Browse latest Browse all 21975

Script -asjob (modified bgping script)

$
0
0

Hello,

I liked very much the original bgping script (http://poshtips.com/bgping-a-high-performance-bulk-ping-utility/)
I thought, it would be nice to modify the script for query multiple servers (for example, get some information from them, like Serial Number, asap).

So..

Ive cut the lines i didnt need (IP address checking, results etc.. ) and left only JOB related lines..

Param ([int]$BatchSize=3)
 #list of servers
$source = Get-Content .\servers_FQDN.txt
 #scriptblock
$blok = {gwmi win32_bios |select serialnumber}

$elapsedTime = [system.diagnostics.stopwatch]::StartNew()
$result = @()
$itemCount = 0

## checking running jobs 
if (get-job|? {$_.name -like "Script*"}){
    write-host "ERROR: There are pending background jobs in this session:" -back red -fore white
    get-job |? {$_.name -like "Script*"} | out-host
    write-host "REQUIRED ACTION: Remove the jobs and restart this script" -back black -fore yellow
    $yn = read-host "Automatically remove jobs now?"
    if ($yn -eq "y"){
        get-job|? {$_.name -like "Script*"}|% {remove-job $_}
        write-host "jobs have been removed; please restart the script" -back black -fore green
        }
    exit
    }
$offset = 0

## measure object
$itemCount = $source.count
Write-Host "Script will run against $itemcount servers!"

## Script start time mark
write-host " Script started at $(get-date -Format ("yyyy/MM/dd hh:mm:ss")) ".padright(100)             -back darkgreen -fore white
write-host "                    (contains $itemCount unique entries)" -back black -fore green
$activeJobCount = 0
$totalJobCount = 0
write-host "Submitting background jobs..." -back black -fore yellow
## end of clean, verified code




for ($offset=0; $offset -le $itemCount;$offset += $batchSize){
    $activeJobCount += 1; $totalJobCount += 1; $HostList = @()
    $HostList += $source |select dnshostname |sort |get-unique |select -skip $offset -first $batchsize
    $j = invoke-command -computername $($source) -scriptblock $blok -asjob
    $j.name = "Script`:$totalJobCount`:$($offset+1)`:$($HostList.count)"
    write-host "+" -back black -fore cyan -nonewline
  }

write-host "`n$totaljobCount jobs submitted, checking for completed jobs..." -back black -fore yellow
$recCnt = 0
while (get-job |? {$_.name -like "Script*"}){
    foreach ($j in get-job | ? {$_.name -like "Script*"}){
        $temp = @()
        if ($j.state -eq "completed"){
            $temp = @()
            $temp += receive-job $j
            $result += $temp
            remove-job $j
            $ActiveJobCount -= 1
            write-host "-" -back black -fore cyan -nonewline
            }
         }

 if ($result.count -lt $itemCount){
        sleep 3
        }
    }

write-host " "
write-host  " Script finished at $(get-date) ".padright(60) -back darkgreen -fore white
write-host ("   Number of hosts  : {0}" -f $($result.count)) -back black -fore green
write-host ("   Elapsed Time : {0}" -f $($ElapsedTime.Elapsed.ToString())) -back black -fore green
write-host "TEMP variable: $temp"
$result

write-host  " Script completed all requested operations at $(get-date -Format ("yyyy/MM/dd hh:mm:ss")) ".padright(60) -back darkgreen -fore white
write-host ("   Elapsed Time : {0}" -f $($ElapsedTime.Elapsed.ToString())) -back black -fore green

There is a bug i didnt discovered yet, the $result table containts $temp*number_of_jobs ... why?

If i run this script against 10servers, divided by 2 (batchsize 2), it would create 5 background jobs. While $temp contains serial number from every single server, $result will multiply it * 5.

I can use $temp as result as well, but original author used $result for a reason ...

I  think the problem starts with line
foreach($jinget-job|?{$_.name-like"Script*"}){

...  can u correct this script, so i will get results only 1 time?  In case of 10 servers with batchsize of 2, it will create 5jobs containing 2 queries ...

Elapsed time is now ~24sec, i think it should be done in around 6..



Viewing all articles
Browse latest Browse all 21975

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>