MK-Gii Ответов: 1

PowerShell для получения на выходе из удаленной оболочки PowerShell работа


Привет,

Я запускаю следующий сценарий powershell для запуска исполняемого файла на нескольких серверных машинах. Этот исполняемый файл занимает около 1 минуты для завершения и вывода результатов в окно консоли:

$servers = 'Srv001', 'Srv002';
$ErrorActionPreference = "STOP";

$credentials = Get-Credential 'adm\runner';

foreach($srv in $servers){

	$session = New-PSSession -ComputerName $srv -Credential $credentials;

        Invoke-Command -Session $session -ScriptBlock {
		    Write-Host ('Executing task on ' + $args) -ForegroundColor Green;
            PowerShell.exe -Command "& ""cmd.exe /C C:\Miner.exe""";
            Write-Host '---TEST COMPLETE---' -ForegroundColor Green;
	    } -ArgumentList $srv; #-AsJob
}

Remove-PSSession *;


теперь-все это работает нормально, но в текущем примере мне нужно подождать 2 минуты, так как я запускаю это на 2 серверах. Чтобы решить эту проблему, я добавил переключатель "- AsJob " в командлет Invoke-Command (закомментированная часть кода), но теперь я потерял представление результатов, потому что теперь они работают в фоновом режиме как задания и не выводят результаты в консоль.

Есть какие-нибудь мысли, как я мог бы получить это обратно? Хотя у меня есть 2 новых объекта - 2 задания, но они, похоже, не имеют свойства "выводить" или что-то в этом роде....

Спасибо!

Что я уже пробовал:

См. код в описании проблемы.

1 Ответов

Рейтинг:
1

MK-Gii

Мне удалось решить это самому:


1. Вызов-команда как задание.
2. Когда все удаленные задания вызываются, я запускаю цикл, который проверяет, все ли мои задания завершены:

While($true){

    Write-Host ((Get-Date).ToString('HH:mm:ss')) -ForegroundColor Green;
    
    $allFinished = $true;

    for($i = 0; $i -le (Get-Job).Count - 1; $i++){
        $currentJobCompleted = (Get-Job)[$i].State -eq 'Completed';
        $allFinished = $allFinished -and $currentJobCompleted;
    }

    if($allFinished -eq $true){
        break;
    }else{
        for($i = 0; $i -le (Get-Job).Count - 1; $i++){
            Write-Host ((Get-Job)[$i].Location + ' ' + (Get-Job)[$i].State) -ForegroundColor Gray;
        }        
    }

    Start-Sleep -Seconds 10;
}

Remove-PSSession *;


после того, как все задания завершены - я выполняю
Receive-job <job id>


вот так просто!
надеюсь, это кому-нибудь поможет