Severity Level: Warning
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
Scriptresource in DSC configurations, specifically for theGetScript,TestScriptandSetScriptproperties
* 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.
$var = "foo"
1..2 | ForEach-Object -Parallel { $var }$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 }