Вопрос

Я столкнулся с проблемой: мой сценарий 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top