Powershell - Как вызвать две функции с помощью Start-Job внутри функции и передать список имен компьютеров? - PullRequest
1 голос
/ 14 апреля 2020

У меня есть главный скрипт, который импортирует модуль \ path \ to \ 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» не распознается как имя командлета, функции, файла сценария или работающей программы.

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

FINAL Решение:

Start-Job -InitializationScript {Import-Module "Pathto\Functions.ps1"}  -ScriptBlock { param($Servers) Run_Scan1 $Servers } -ArgumentList (,$servers)

1 Ответ

0 голосов
/ 14 апреля 2020

Для массивов я рекомендую использовать область действия. Задания плохо обрабатывают параметры массива. Используйте 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
...