Передать [switch] внутри Start-Job

Есть скрипт для логона пользователей, вызывает по очереди другие скрипты, в зависимости от условий. Для того, что бы вызывать скрипты можно было по отдельности вручную, добавлен параметр [switch]$Silent. Вопрос - как передать данный параметр внутри Start-Job? Пробовал по-разному добавлять в argumentlist - значение всегда попадает в соседний параметр, независимо от очередности. Пример основного скрипта

Param(
    [string]$location = 'C:\Users',
    [switch]$Silent
)
    Start-Job -FilePath ".\Fonts_Install.ps1" -ArgumentList ($Silent,$location) | Wait-Job

Вырезка из вызываемого скрипта

Param(
    [switch]$Silent = $false,
    [string]$location = '.'
)

switch ($Silent) {
    $false {
        if ($Error.Count -gt 0) {
            for ($i = 0; $i -le ($Error.Items.Count + 1); $i++) {
                $errMSG = "$Error"
            }
            [System.Windows.Forms.MessageBox]::Show("$errMSG", "Error", "OK", "Error")
        }
        else {
            [System.Windows.Forms.MessageBox]::Show("ок", "Fonts", "OK", "Asterisk") | out-null
        }
    }
}

Ответы (1 шт):

Автор решения: Stepan Terehov

К сожалению, указание сквозных аргументов через Start-Job -ArgumentList ( -Args) ограничен позиционными аргументами, что предотвращает привязку параметров [switch], чьи аргументы по определению должны быть именованными.

В качестве обходного пути вместо использования -FilePath вызовите свой сценарий через параметр -ScriptBlock. Внутри скриптового блока ({ ... } именованные аргументы могут использоваться в вызовах скрипта, как обычно:

Start-Job -ScriptBlock {
  .\Fonts_Install.ps1 -Silent:$using:Silent $using:Location
} | Receive-Job -Wait -AutoRemoveJob
  • Обратите внимание на использование области $using: для встраивания значений переменных из области действия вызывающей программы в блок сценария, который будет выполняться в фоновом режиме.

  • Вам по-прежнему нужно обращаться к параметру -Silent по имени, а о том, включен переключатель или нет, можно сообщить, добавив к нему :$true или :$false, что и означает :$using:Silent.

P.S. Ответ получен тут - https://stackoverflow.com/questions/72963472/pass-switch-inside-start-job/72967196#72967196

→ Ссылка