Удаленный сеанс PowerShell и проблема с запуском задания

Я пытаюсь запустить следующий скрипт с заданием, но код в блоке выполняет только 1-ю команду и завершается. На моем компьютере задание отображается как выполненное

$computers = get-adcomputer -filter * | where { ($_.DNSHostName -match 'server')} 

foreach ($computer in $computers) {
        $session = New-PSSession -ComputerName $computer.DNSHostName
        Invoke-Command -Session $session -ScriptBlock {
            Stop-Service  W3SVC -Force
            Remove-Item "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root" -Force -Recurse
            Start-Service  W3SVC     
        } -asjob -jobname IIS_Maintenance
        Remove-PSSession -Session $session
}

Если я закомментирую задание -asjob -jobname IIS_Maintenance, оно будет работать нормально, но синхронно. Для остановки IIS требуется несколько секунд, но я не уверен, почему работа не ждет этого.

Мысли?


person opti2k4    schedule 06.09.2017    source источник
comment
Вы просто пытаетесь сделать это асинхронно?   -  person ArcSet    schedule 06.09.2017
comment
Arghhhh Я только что заметил, что поставил плохой код, я начал экспериментировать, чтобы выяснить, в чем проблема... Правильный код: $session = New-PSSession -ComputerName $computer.DNSHostName Invoke-Command -Session $session -ScriptBlock .. .. Строки начала работы нет. Да, я пытаюсь выполнить это асинхронно, чтобы иметь X параллельных заданий.   -  person opti2k4    schedule 06.09.2017
comment
Вместо того, чтобы размещать свой код в трудночитаемом формате в комментарии, вы можете отредактировать исходный пост с помощью обновленного кода.   -  person Jason Snell    schedule 06.09.2017
comment
Спасибо, Джейсон, код теперь отредактирован.   -  person opti2k4    schedule 06.09.2017


Ответы (2)


Создание сеанса вызывает большую задержку. Почему вы решили использовать -Session вместо прямого использования -ComputerName ?

Я думаю, что использование способа -ComputerName будет более эффективным для работы с Start-Job. В любом случае, поскольку вы вызываете задания на удаленных машинах, ваша рабочая станция не будет знать о ходе выполнения заданий.

Если вы хотите отслеживать ход выполнения заданий, вам вообще не следует использовать Invoke-Command.

person Sid    schedule 06.09.2017
comment
Причина использования сеанса в том, что мне нужно выполнить несколько команд, поэтому было бы более эффективно открыть сеанс, выполнить несколько команд и затем закрыть сеанс. Также из книги Изучите Powershell за месяц обедов: PS C:\› start-job -scriptblock { invoke-command -command { dir } ➥-computername SERVER-R2 } Это совершенно лишнее; сохраните раздел Invoke-Command и используйте параметр -AsJob, чтобы он работал в фоновом режиме. - person opti2k4; 07.09.2017

Хорошо, я понял это... пункт путаницы был:

1) Я не знал, что могу отправить блок кода без сеанса, и да, реализация сеанса медленная

2) Я также не знал, что я отправляю команду вызова на несколько компьютеров один раз без foreach. Спасибо за это Ансгару Вихерсу!

person opti2k4    schedule 07.09.2017