J'ai un script batch contenant le code suivant:
Voici le script batch (Test.bat):
START /wait powershell.exe -executionpolicy remotesigned -File TheScriptToBeExecuted.ps1
Le script Powershell ( TheScriptToBeExecuted.ps1) a une certaine attente intégrée. Mais lorsque ce fichier est appelé, le script batch n'attend PAS la fin du script Powershell.
J'ai déjà essayé:
call powershell.exe -executionpolicy remotesigned -File TheScriptToBeExecuted.ps1 exit /b
Sans effet .
Quand je double-clique sur le fichier Test.bat, il semble attendre. J'ai vérifié beaucoup de réponses, mais je n'ai trouvé aucune correspondant à ce problème.
Veuillez aider.
3 Réponses :
START /wait PowerShell.exe "& "'C:\path\TheScriptToBeExecuted.ps1'
Merci Shadoe2020, le problème est que j'ai besoin que le script batch attende la fin du script Powershell avant de continuer, ce qui fonctionne parfaitement de manière autonome, mais lorsqu'il est appelé depuis notre planificateur de tâches, il appelle simplement le script Powershell et se déplace.
powershell -command "((Get-date).AddDays(0)).ToString(':dd:MM:yyyy') | set-content 'captureVar.txt'" && set /p Yesterday=<captureVar.txt
J'ai déjà essayé les 2 options ci-dessus et, comme je l'ai mentionné, elles fonctionnent bien indépendamment, car lorsque je double-clique sur le fichier .bat, il attend absolument que le script Powershell se termine avant de passer à autre chose, cependant, nous appelons le Le script Test.bat de notre planificateur de tâches Mainframe (Stonebranch) et le même script batch exact n'attend pas que le script Powershell se termine, il se termine essentiellement dès qu'il appelle le processus de manière étrange!
J'ai donc fini par coder un correctif autour de lui, pour que le script Powershell crache un fichier de sortie à la fin de son exécution et le script batch finit par rechercher le fichier et s'il n'est pas trouvé, il attend quelques minutes et vérifie à nouveau jusqu'à ce que il le trouve. C'est exactement ce que j'essayais d'éviter et j'espérais qu'il y avait un moyen très simple d'attendre la fin du script PS.
Je viens de tester la même chose en lançant un appel au lot de lancement de ps1 à partir d'un lot sur une clé USB, et ce fut un désastre en quelque sorte. Non seulement le lot n'a pas attendu, mais le script PowerShell ne s'est pas exécuté correctement. Je vais devoir rechercher le comportement des appels dans des annuaires non locaux pour comprendre ce qui se passe ici.
Je pense que le problème est plus susceptible de se trouver dans "TheScriptToBeExecuted.ps1" que dans votre chauve-souris. En fait, plusieurs commandes PowerShell fonctionnent comme Asyncronous. J'ai testé un Sleep-Start, qui n'est pas du tout Asyncronous en utilisant le code suivant et la chauve-souris en attend la fin. C'est le code que j'ai utilisé dans mon .bat
Start-Sleep -Seconds 25
Le contenu ps1 est juste une ligne, ci-dessous:
REM RUNTEST.BAT time /T echo started powershell -executionpolicy remotesigned -File C:\Users\Alex\Desktop\DA_PROVARE\test.ps1 time /T echo done exit /b
N'utilisez pas les commandes
CALL
ouSTART
. Ils ne sont pas nécessaires pour ce que vous essayez de faire.Y a-t-il une raison pour laquelle vous ne pouvez pas utiliser timeout, pause ou Choice / T xxx / C / M y / D n / M "Y / N"?
@Squashman, merci pour votre réponse, va l'essayer maintenant et publier mes résultats.
@ T3RR0R, nous avons toute notre logique dans Powershell, mais nous utilisons simplement des fichiers batch pour les appeler simplement, en tant que norme d'entreprise pour les scripts Powershell.
Bien sûr, mais avec Choice / T ou timeout, vous pouvez passer à une fonction pour tester si le script PowerShell est toujours actif, ce qui signifie qu'aucune interaction directe de l'utilisateur n'est nécessaire. Je suppose que ces lots fonctionnent en silence avec quelque chose du genre vbscript? vbs pourrait également être utilisé pour surveiller l'état du processus pour PowerShell et appeler un autre lot silencieux pour forcer l'entrée dans le lot principal pour continuer une fois que le scipt PowerShell est fermé.
@Squashman, toujours pas de chance.
@ T3RR0R, merci pour votre réponse, j'espérais pouvoir y parvenir directement avec juste quelques options standard de scripts par lots, mais il semble que c'est la voie que je devrai emprunter s'il n'y a pas d'autres options.
@ Number10, je ne sais pas quoi vous dire. Là où je travaille, nous avons des dizaines de fichiers de commandes qui exécutent également des scripts PowerShell et ne voient pas le même comportement lors de l'exécution directe de PowerShell.exe.
J'ai exécuté votre code d'origine comme
powershell.exe -executionpolicy remotesigned -File TheScriptToBeExecuted.ps1
. La seule chose que j'ai mise dans le Powershell était une applet de commande de veille pendant 10 secondes. J'ai ensuite mis une pause dans le fichier batch après le PowerShell. Si votre théorie est vraie, je devrais voir la sortie de la commande pause avant la fin du sommeil du PowerShell, mais je ne l'ai pas fait. La pause ne s'est pas exécutée avant la fin des 10 secondes de veille du PowerShell.Démarrer / attendre [sans aucune autre modification avant ou après] conservera le lot, cependant, selon la façon dont le script se termine, il en résulte une invite Terminer le travail par lots - par opposition à la poursuite fiable d'autres commandes de lots sans interaction.
@Squashman, le script fonctionne parfaitement lorsqu'il est exécuté de manière autonome, c'est-à-dire qu'il attend absolument que le script Powershell se termine avant de continuer comme je l'ai mentionné ci-dessus. Cependant, nous appelons le script Test.bat à partir de notre planificateur de tâches Mainframe (Stonebranch) et le même script batch exact n'attend pas que le script Powershell se termine, il se termine essentiellement dès qu'il appelle le processus de manière étrange!
J'ai donc fini par coder un correctif autour de lui, pour que le script Powershell crache un fichier de sortie à la fin de son exécution et le script batch finit par rechercher le fichier et s'il n'est pas trouvé, il attend quelques minutes et vérifie à nouveau jusqu'à ce que il le trouve. C'est exactement ce que j'essayais d'éviter et j'espérais qu'il y avait un moyen très simple d'attendre la fin du script PS.
Quelles que soient les nouvelles informations que vous avez fournies, cmd.exe ne se comportera pas différemment.