Зависшая команда в Powershell, но не в Cmd.exe
-
21-12-2019 - |
Вопрос
Я столкнулся с проблемой: мой сценарий PowerShell ведет себя очень странно.
Есть небольшой фрагмент большого сценария:
Write-Host "Installation in progress..."
Invoke-Command -Session $session -ThrottleLimit 64 -ScriptBlock {.\XenDesktopServerSetup.exe /QUIET /CONFIGURE_FIREWALL /components $using:componentparam /nosql }
Write-Host "Installation completed"
Иногда, даже если выполнение XenDesktopServerSetup.exe
завершено, мой скрипт не переходит к следующей команде Write-Host "Installation completed"
Мне нужно щелкнуть где-нибудь в оболочке или прервать сценарий с помощью CTRL+C, чтобы увидеть конец моего сценария;
Я пытался изменить ThrottleLimit
, но у меня нет эффекта.
Я использую Powershell V4.0.
В $Session только один сервер.
РЕДАКТИРОВАТЬ :Я попробовал эту команду прямо на моем сервере, я открыл PS Shell и выполнил:
.\XenDesktopServerSetup.exe /QUIET /CONFIGURE_FIREWALL /components CONTROLLER /nosql
У меня такая же проблема !
Но когда я попробовал ту же команду в Cmd.exe, она работала отлично и всегда!
Как я могу выполнить эту команду в Cmd.exe?Я хочу что-то вроде этого:
Write-Host "Installation in progress..."
Invoke-Command -Session $session -ThrottleLimit 64 -ScriptBlock {Cmd.exe .\XenDesktopServerSetup.exe /QUIET /CONFIGURE_FIREWALL /components $using:componentparam /nosql }
Write-Host "Installation completed"
Это показывает нам, что между cmd.exe и powershell есть разница в том, как PS вызывает файл .exe, но я совершенно не понимаю, почему это работает в cmd.exe, а не в powershell.
Спасибо за ваши предложения
Решение 2
Вот как я решил эту проблему, я много проверял и у меня нет проблем:
Write-Host "Installation in progress..."
Invoke-Command -Session $session -ScriptBlock {$Components = $using:componentparam}
Invoke-Command -Session $session -ScriptBlock {Invoke-Expression "cmd /C '$IsoLetter\x64\XenDesktop Setup\XenDesktopServerSetup.exe' /QUIET /CONFIGURE_FIREWALL /components $Components /nosql" }
Write-Host "Installation completed"
Что вы думаете?Я думаю проблема в .exe файле..что-то не так.
Но, наконец, я решил это, используя Invoke-expression
и cmd /C
Другие советы
Вы уверены, что все удаленные серверы готовы?Вы можете использовать параметр -AsJob, а затем периодически проверять состояние каждого задания с помощью Get-Job.Получите выходные данные с помощью Receive-Job.Вы даже можете дождаться завершения всех операций по тайм-ауту, используя Wait-Job $jobs -Timeout 120.