Pattern: Missing use of $using:
in new runspaces
Issue: -
If a ScriptBlock is intended to be run in a new RunSpace, variables inside it should use $using:
scope modifier, or be initialized within the ScriptBlock.
This applies to:
- Invoke-Command *
- Workflow { InlineScript {}}
- Foreach-Object **
- Start-Job
- Start-ThreadJob
- The
Script
resource in DSC configurations, specifically for theGetScript
,TestScript
andSetScript
properties
* Only with the -ComputerName or -Session parameter.
** Only with the -Parallel parameter
Within the ScriptBlock, instead of just using a variable from the parent scope, you have to add the using:
scope modifier to it.
Example of incorrect code:
$var = "foo"
1..2 | ForEach-Object -Parallel { $var }
Example of correct code:
$var = "foo"
1..2 | ForEach-Object -Parallel { $using:var }
$bar = "bar"
Invoke-Command -ComputerName "foo" -ScriptBlock { $using:bar }
$bar = "bar"
$s = New-PSSession -ComputerName "foo"
Invoke-Command -Session $s -ScriptBlock { $using:bar }
# Remark: Workflow is supported on Windows PowerShell only
Workflow {
$foo = "foo"
InlineScript { $using:foo }
}
$foo = "foo"
Start-ThreadJob -ScriptBlock { $using:foo }
Start-Job -ScriptBlock {$using:foo }