# encoding: ascii
# api: powershell
# title: Sample MultiThreading
# description: An example of multi threading in powershell
# version: 172.16.1
# type: function
# author: Autom8
# license: CC0
# x-poshcode-id: 6739
# x-archived: 2017-05-11T14:42:11
# x-published: 2017-02-19T02:48:00
#
#
#Make new CSV File
$CSVFileName = "\\networkshare\folder\filename.csv"
"CSV,Header,With,Well,Named,Data,Columns" > $CSVFileName
$Timestamp = get-date -format o
#Log file
$LogFileName = "\\networkshare\folder\logfile_$Timestamp.log"
#Function to do stuff with IP address
$SomeFunction = {
param($IPAddress,$CSVFileName,$LogFileName)
#do stuff with $IPAddress
#To simulate some actual processing
Sleep -s 1
#format output for CSV file
$CSVOutput = "Hello,$IPAddress,My,Name,Is,Mr,Bean"
$CSVOutput >> $CSVFileName
#always output any errors to a log file
$error >> $LogFileName
}
#Array of subnets in our network
$Subnets = @("192.168.1.","192.168.2.","172.16.1.")
#Array will use to store different networks
$Networks=@()
foreach($Subnet in $Subnets)
{
#Array will be using to store IP addresses in network
$Network=@()
#Build a list of IPs in that subnet
$IPs = 1..254
#Populate the subnet with IPs
foreach($IP in $IPs){$Network+=($Subnet + $IP)}
#Add the network to the array of networks
$Networks += $Network
}
#Get total number of IP addresses
$NumIPaddresses = 0
foreach($Network in $Networks)
{
foreach($IP in $Network){$NumIPaddresses++}
}
#### Now this is where the multi threading part begins ####
#Restrict Number of threads or you'll overload the server/computer
$NumThreads = 20
$ThreadsProcessed = 0
foreach($Network in $Networks)
{
foreach($IP in $Network)
{
#Make sure we don't go over our maximum number of threads to process at any given time
$NumJobsRunning = get-job -State Running
while($NumJobsRunning.Count -ge $NumThreads)
{
#chill out for 30 seconds, wait for other threads to finish
Sleep -s 30
$NumJobsRunning = get-job -State Running
}
#Start a new thread
Start-Job -ScriptBlock $SomeFunction -ArgumentList $IP,$CSVFileName,$LogFileName
$ThreadsProcessed++
#Lets us know how we're progressing
$Status = "$ThreadsProcessed of $NumIPAddresses threads processed"
echo $Status
}
}
#Check out our fancy CSV file
$CSVData = Import-CSV $CSVFileName
$CSVData | Out-gridview