Передать [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 шт):
К сожалению, указание сквозных аргументов через 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