Проблема с форматированием запуска Powershell

Я впервые использую start-jobs, он не работает должным образом, я неправильно его использую?

$dagName = "dag Name";
$dagObject = Get-DatabaseAvailabilityGroup -Identity $dagName;

$servers = New-Object System.Collections.ArrayList;
foreach($server in $dagObject.Servers)
{
    $servers.Add($server) | Out-Null;
}

$getExchangeServers = @();
$getMailboxDatabases = @();
$getMailboxDatabasesWithStatus = @();

Start-Job -ScriptBlock {foreach ($server in $servers) {$getExchangeServers += get-exchangeserver $server;}}
Start-Job -ScriptBlock {foreach ($server in $servers) {$getMailboxDatabases += Get-MailboxDatabase -Server $server;}}
Start-Job -ScriptBlock {foreach ($server in $servers) {$getMailboxDatabasesWithStatus += Get-MailboxDatabase -Server $server -Status;}}

person Bbb    schedule 28.06.2017    source источник
comment
Да Вы. Задания похожи на совершенно отдельные экземпляры PowerShell. Они понятия не имеют, что такое $servers, и не могут получить доступ ни к одной из переменных $getMailboxDatabases.   -  person TessellatingHeckler    schedule 28.06.2017
comment
Спасибо. Как бы вы поправили код? Могу ли я сделать что-то подобное? $results1 = Start-Job -ScriptBlock {foreach ($server in $servers) {$getExchangeServers += get-exchangeserver $server;}} -ArgumentList $servers;   -  person Bbb    schedule 28.06.2017
comment
Вам понадобится param оператор.   -  person BenH    schedule 28.06.2017
comment
Нет, вы не можете этого сделать; Вам нужно передать параметры с помощью -ArgumentList и изменить блоки сценариев, чтобы они принимали параметры, и использовать $AllResults = Get-Job | Receive-Job -Wait -AutoRemoveJob, чтобы получить их вывод и удалить задания, чтобы они не зависали после этого.   -  person TessellatingHeckler    schedule 28.06.2017
comment
Итак, я пробовал это: (но безрезультатно). Он говорит мне, что не может найти работу. Не могли бы вы предоставить рабочий пример, чтобы я мог от него отталкиваться? $job1 = Start-Job -ScriptBlock {foreach ($server in $servers) {$getExchangeServers += get-exchangeserver $server;}} -ArgumentList $servers; $results1 = Get-Job -Name $job1 | Прием-Задание - Подождите - AutoRemoveJob   -  person Bbb    schedule 28.06.2017
comment
Попробуйте это Я пробовал {что-то другое}, но это не сработало. хм. $server = 'a','b','c'; Start-Job -ScriptBlock { param($p) foreach ($server in $p) { $server } } -ArgumentList @(,$Servers); $AllResults = Get-Job | Receive-Job -Wait -AutoRemoveJob; $AllResults — это рабочий пример того, как просто поместить несколько имен серверов в задание и получить их обратно.   -  person TessellatingHeckler    schedule 28.06.2017
comment
Итак, я попробовал Start-Job -ScriptBlock { param($p) foreach ($server in $p) { $getExchangeServers += get-exchangeserver $server; } } -ArgumentList @(,$Servers); $AllResults = Get-Job | Прием-Задание - Подождите - AutoRemoveJob; И это дало мне следующую ошибку. Термин «get-exchangeserver» не распознается как имя командлета. Должен ли блок сценария также инициализировать соединение с сервером Exchange?   -  person Bbb    schedule 28.06.2017
comment
Я использовал это: Start-Job -ScriptBlock { param($p) $session1 = new-pssession -ConfigurationName Microsoft.Exchange -ConnectionUri 'xxxxxx /powershell'; import-pssession $session1 -AllowClobber; $getExchangeServers = @(); foreach ($ server in $ p) { $ getExchangeServers += get-exchangeserver $ server; } } -ArgumentList @(,$Servers); $AllResults = Get-Job | Прием-Задание - Подождите - AutoRemoveJob; Но $allResults соответствует имени установленного временного сеанса PowerShell Exchange, известного как $session1.   -  person Bbb    schedule 28.06.2017
comment
Это совершенно бесполезно, Ансгар Вихерс, красиво сделано   -  person Bbb    schedule 29.06.2017