about_Foreach-Parallel
Describes the foreach -Parallel
language construct in Windows PowerShell
Workflow.
The Parallel parameter of the foreach
keyword runs the commands in a
foreach
script block once for each item in a specified collection.
The items in the collection, such as a disk in a collection of disks, are processed in parallel. The commands in the script block run sequentially on each item in the collection.
foreach -Parallel
is valid only in a Windows PowerShell Workflow.
foreach -Parallel ($<item> in $<collection>) {
[<Activity1>]
[<Activity2>]
...
}
Like the foreach
statement in Windows PowerShell, the variable that contains
collection $<collection>
must be defined before the foreach -Parallel
statement, but the variable that represents the current item $<item>
is
defined in the foreach -Parallel
statement.
The foreach -Parallel
construct is different from the foreach
keyword and
the Parallel parameter. The foreach
keyword processes the items in the
collection in sequence. The Parallel parameter runs commands in a script
block in parallel. You can enclose a Parallel script block in a
foreach -Parallel
script block.
The target computers in a workflow, such as those specified by the
PSComputerName workflow common parameter, are always processed in parallel.
You do not need to specify the foreach -Parallel
keyword for this purpose.
The following workflow contains a foreach -Parallel
statement that processes
the disks that the Get-Disk
activity gets. The commands in the
foreach -Parallel
script block run sequentially, but they run on the disks in
parallel. The disks might be processed concurrently and in any order.
workflow Test-Workflow {
$Disks = Get-Disk
# The disks are processed in parallel.
foreach -Parallel ($Disk in $Disks)
{
# The commands run sequentially on each disk.
$DiskPath = $Disk.Path
$Disk | Initialize-Disk
Set-Disk -Path $DiskPath
}
}
In this version of the workflow, the Get-Process
and Get-Service
commands
are run in parallel. The workflow function continues to the foreach -Parallel
loop where the commands are run sequentially, but they run on the disks in
parallel. The parallel commands and the foreach -Parallel
loop run
concurrently.
workflow Test-Workflow {
#Run commands in parallel.
parallel
{
Get-Process
Get-Service
}
$Disks = Get-Disk
# The disks are processed in parallel.
foreach -Parallel ($Disk in $Disks)
{
# The commands run in parallel on each disk.
parallel
{
Initialize-Disk
inlinescript {.\Get-DiskInventory}
}
}
}
PowerShell feedback
PowerShell is an open source project. Select a link to provide feedback: