description | ms.custom | ms.date | ms.topic | title |
---|---|---|---|---|
Use 'Using:' scope modifier in RunSpace ScriptBlocks |
PSSA v1.21.0 |
10/18/2021 |
reference |
UseUsingScopeModifierInNewRunspaces |
Severity Level: Warning
If a scriptblock is intended to be run in a new runspace, variables inside it should use the
$using:
scope modifier, or be initialized within the scriptblock. This applies to:
Invoke-Command
- Only with the ComputerName or Session parameter.Workflow { InlineScript {} }
Foreach-Object
- Only with the Parallel parameterStart-Job
Start-ThreadJob
- The
Script
resource in DSC configurations, specifically for theGetScript
,TestScript
andSetScript
properties.
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 }