about_Foreach-Parallel
SHORT DESCRIPTION
Describes the ForEach -Parallel
language construct in Windows PowerShell
Workflow.
LONG DESCRIPTION
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.
SYNTAX
ForEach -Parallel ($<item> in $<collection>)
{
[<Activity1>]
[<Activity2>]
...
}
DETAILED DESCRIPTION
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.
EXAMPLES
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}
}
}
}