У меня есть основной скрипт, который импортирует модуль \ путь \ к \ functions.psm1, я вызываю функцию в основном скрипте с именем: Run_Scans $ ServerList, который взят из functions.psm1, из Run_Scans я пытаюсь вызвать две другие функции (Scan1 , Scan2) с помощью Start-Job, но не может передать переменную серверов другим функциям. Я пробовал несколько разных способов: либо задание не выполняется, либо завершается, но список серверов проходит. Любая помощь будет принята с благодарностью.

#This is from the main script#
Import-Module "path\to\Functions.psm1"
Run_Scans $ServerList

#This is from functions.psm1#
Function Run_Scans ($Servers){
#Start-Job -Name 'Scan1' -ScriptBlock {Run_Scan1 $using:Servers}
#Start-Job -Name 'Scan2' -ScriptBlock {Run_Scan2 $using:Servers}

$Scan = {
    param ($Servers)
    Run_Scan1 $Servers
    Run_Scan2 $Servers
}
Start-Job -ScriptBlock $Scan -ArgumentList $Servers
}

Function Run_Scan1 ($Servers){
    scan code
}
Function Run_Scan2 ($Servers){
    scan code
}

ОБНОВИТЬ:

Мне удалось сделать следующее:

$ServerList = "Serv1","Serv2","Serv3"
Start-Job -InitializationScript $Initialization -ScriptBlock {param($servers) echo $servers} -args (,$servers)

Receive-Job 

Выход:

Serv1

Serv2

Serv3

Но когда я пытаюсь включить вызов функции:

$Initialization = [scriptblock]::Create("Import-Module -Name 'Pathto\Functions.psm1'")
Start-Job -InitializationScript $Initialization -ScriptBlock {param($servers) Run_Scan1 $servers} -args (,$servers)

Я получаю следующие ошибки:

Термин «Run_Scan1» не распознается как имя командлета, функции, файла сценария или работающей программы.

Невозможно индексировать в пустой массив.

Окончательное решение:

Start-Job -InitializationScript {Import-Module "Pathto\Functions.ps1"}  -ScriptBlock { param($Servers) Run_Scan1 $Servers } -ArgumentList (,$servers)
1
Chris 14 Апр 2020 в 23:12

1 ответ

Лучший ответ

Для массивов я рекомендую использовать scope. Задания плохо обрабатывают параметры массива. Используйте start-threadjob, если он у вас есть.

$servers = echo server1 server2

start-job { param($servers) $servers } -args $servers | receive-job -wait -auto

server1


start-job { $using:servers } | receive-job -wait -auto          

server1
server2

Или есть этот нелепый (,) обходной путь:

start-job { param($servers) $servers } -args (,$servers) | receive-job -wait -auto

server1
server2
0
js2010 14 Апр 2020 в 21:07