Commande bloquée dans Powershell mais pas dans Cmd.exe
-
21-12-2019 - |
Question
je suis confronté à un problème, mon script PowerShell a un comportement très étrange.
Il y a un petit morceau d'un gros script :
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"
Parfois même si l'exécution de XenDesktopServerSetup.exe
est terminé mon script ne passe pas à la commande suivante Write-Host "Installation completed"
Je dois cliquer quelque part dans le shell ou interrompre le script avec CTRL+C pour voir la fin de mon script ;
J'ai essayé de changer ThrottleLimit
, mais je n'ai aucun effet.
J'utilise Powershell V4.0.
Il n'y a qu'un seul serveur dans $Session.
MODIFIER :J'ai essayé cette commande directement sur mon serveur, j'ai ouvert un PS Shell et exécuté :
.\XenDesktopServerSetup.exe /QUIET /CONFIGURE_FIREWALL /components CONTROLLER /nosql
J'ai eu le même problème !
Mais quand j'ai essayé la même commande dans Cmd.exe, cela fonctionne parfaitement et à chaque fois !
Comment puis-je exécuter cette commande dans Cmd.exe ?Je veux quelque chose comme ça :
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"
Cela nous montre qu'il y a une différence entre cmd.exe et PowerShell dans la façon dont PS appelle le fichier .exe, mais je ne comprends pas du tout pourquoi cela fonctionne dans cmd.exe mais pas dans PowerShell.
Merci pour vos suggestions
La solution 2
Voici comment je l'ai résolu, je l'ai beaucoup testé et je n'ai aucun problème :
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"
Qu'en penses-tu?Je pense que le problème vient du fichier .exe.il y a quelque chose qui ne va pas.
Mais finalement je l'ai résolu en utilisant Invoke-expression
et cmd /C
Autres conseils
Êtes-vous sûr que tous les serveurs distants sont terminés ?Vous pouvez utiliser le paramètre -AsJob, puis inspecter périodiquement l'état de chaque tâche à l'aide de Get-Job.Récupérez la sortie avec Receiver-Job.Vous pouvez même attendre que tout se termine avec un délai d'attente en utilisant Wait-Job $jobs -Timeout 120