Start-Job - Позиционный порядок аргументов - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь понять правильный порядок аргументов при использовании Start-Job.Как правильно указать параметры для задания PowerShell?

Я ожидаю, что при этом будет напечатано hello world, но при этом будет напечатано world hello.

Is Param() или -ArgumentListпроблема тут?

$foo = "hello"
$bar = "world"

$job = Start-Job -ScriptBlock {
    Param(
        $foo,
        $bar
    )
    Write-Host $foo
    Write-Host $bar
} -ArgumentList $bar, $foo

Receive-Job $job

Вывод:

world
hello

1 Ответ

0 голосов
/ 28 февраля 2019

Аргумент параметра -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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...