Аргумент параметра -ArgumentList
- это массив, значения которого передаются параметрам, определенным внутри блока скриптов, в позиционном порядке.Вы не уверены, какой результат вы получите, потому что вы, очевидно, ожидали, что ваши глобальные переменные будут сопоставлены с именами параметров, которые вы определили в своем блоке скриптов.Это не так.
Чтобы проиллюстрировать немного лучше, что происходит в вашем примере, давайте использовать отдельные имена переменных в блоке скриптов и глобальной области видимости:
$a = "hello"
$b = "world"
$job = Start-Job -ScriptBlock {
Param(
$c,
$d
)
Write-Host $c
Write-Host $d
} -ArgumentList $b, $a
По сути, именапараметры не имеют ничего общего с именами переменных в глобальной области видимости.
Вы переключаете значения, когда передаете $b, $a
в блок сценария вместо $a, $b
, следовательно, значение$b
передается $c
, а значение $a
передается $d
.
Обычно можно использовать splatting для сопоставления значений с конкретными именованными параметрами.Однако это не сработает, поскольку -ArgumentList
ожидает массив значений, а не хеш-таблицу.Если разница между позиционными и именованными параметрами вам не ясна, пожалуйста, посмотрите документацию .
Что вы можете сделать, если хотите использовать одинаковые имена переменных внутри и снаружиscriptblock использует квалификатор using:
вместо передачи переменных в качестве аргументов:
$a = "hello"
$b = "world"
$job = Start-Job -ScriptBlock {
Write-Host $using:a
Write-Host $using:b
}