La fenêtre Powershell disparaît avant que je puisse lire le message d'erreur
quand j'appelle un script Powershell, Comment puis-je empêcher le script appelé de fermer sa fenêtre de commande. Je reçois une erreur et je suis sûr que je peux la corriger si je pouvais juste lire l'erreur.
j'ai un script Powershell qui envoie un email avec une pièce jointe en utilisant les classes .NET. Si j'appelle le script directement par l'exécution de la ligne de commande ou en l'appelant depuis le Planificateur de Windows alors qu'il fonctionne très bien. Si je l'appelle de l'intérieur d'un autre script (IronPython, si cela importe) alors il échouer. Tous les scénarios fonctionnent bien sur ma machine de développement. (J'ai vraiment devez obtenir "Fonctionne sur Ma Machine" logo! J'ai l'appel à Powershell qui se passe d'une manière qui affiche une fenêtre de commande et je peux voir un clignotement de rouge juste avant qu'il se ferme.
Désolé: Powershell 1.0, IronPython 1.1
Solution: powershell-noexit d:scriptfoo.ps1
le commutateur noexit fonctionnait bien. Je l'ai juste ajouté aux arguments que je passe D'IronPython. Comme je le soupçonnais, il est quelque chose que je peux probablement corriger moi-même (politique d'exécution, bien que j'ai temporairement fixé comme sans restriction, sans effet, donc je suppose que je dois regarder plus en profondeur). Je poserai une autre question si j'ai des problèmes avec ça.
Merci à tous pour l'aide. J'ai appris que j'ai besoin d'enquêter sur les interrupteurs powershell d'un peu plus près, et je peux voir pas mal de choses qui se révèleront utiles à l'avenir.
10 réponses
vous avez essentiellement 3 options pour empêcher la fenêtre de la Console PowerShell de se fermer, que je décris plus de détails sur mon blog.
- One-temps de Correction: exécutez votre script depuis la Console PowerShell, ou lancez le processus PowerShell en utilisant le commutateur-NoExit. par exemple,
PowerShell -NoExit "C:\SomeFolder\SomeScript.ps1"
- correction par script: ajouter une invite pour la saisie à la fin de votre fichier script. par exemple,
Read-Host -Prompt "Press Enter to exit"
- Global Fix: Changez votre clé de Registre pour laisser toujours la fenêtre de la Console PowerShell ouverte une fois que le script est terminé.
Voici les clés de registre à modifier pour l'option #3:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Applications\powershell.exe\shell\open\command]
@="\"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe\" -NoExit \"& \\"%1\\"\""
[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Command]
@="\"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe\" -NoExit \"-Command\" \"if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & \\"%1\\"\""
Voir mon blog pour plus d'informations et un .fichier reg qui va appliquer ces modifications de registre automatiquement.
j'en ai déjà eu besoin et d'habitude je ne voulais pas modifier le script (typiquement pour les scripts désactivés du Planificateur de tâches). Je voulais juste voir ce qu'on avait recraché pour consoler.
Tout ce que vous avez à faire est d'ajouter une commande Read-Host après l'invocation du script par exemple:
PowerShell.exe -command { .\foo.ps1; read-host "Press enter key to continue" }
une façon ringarde mais efficace de capturer la sortie du script (stdout, stderr, verbose, warning, debug) est d'utiliser un autre hôte comme cmd.exe par exemple:
cmd.exe /c powershell.exe "$pwd\foo.ps1" > foo.log
il n'y a pas D'essai ordinaire...La construction Catch dans Powershell; cependant vous pouvez piéger des exceptions à la place et réagir correctement. I. E:
Function Example() {
trap [Exception] {
write-host "We have an error!";
write-error $("ERROR: " + $_.Exception.Message);
sleep 30;
break;
}
write-host "Hello world!";
throw "Something very bad has happened!";
}
Vous pouvez également simuler Essayer...Catch construction:
Function Example2() {
${
write-host "Our try clause...";
throw "...caused an exception! It hurts!";
}
trap [Exception] {
write-error $_.Exception.Message;
sleep 30;
continue;
}
bien sûr, dès que vous intercepter une exception, vous pouvez vous connecter, de sommeil, ou ce que vous voulez avec le message d'erreur. Mes exemples ne font que dormir, vous permettant de lire ce qui s'est passé, mais il est beaucoup mieux de noter toutes les erreurs. (Le plus simple est de les rediriger avec.)>>
Regardez aussi: http://huddledmasses.org/trap-exception-in-powershell/
Vous avez trois options:
- Faire une capture dans le script (si vous utilisez Powershell V2)
- Écrire un mannequin script qui capture et redirige stdout auquel vous pouvez accéder en tant que variable à partir de votre script IronPython. VBS/WScript Intro Un plus c'est juste généreusement drop Read-Host commandes partout, et appuyez sur return pour passer d'une page.
plutôt que d'envoyer quoi que ce soit à la coque, envelopper votre script powershell dans un second script qui redirige all sortie vers un fichier de log.
PS C:> myscript.ps1 / Out-File myscript.journal
une solution rapide et sale est d'utiliser CTRL+ S pour arrêter le défilement de l'affichage et CTRL+ Q pour la reprendre.
ma solution était deexécuter le script avec une ligne de commande à partir de la fenêtre de la console au lieu de clic droit sur le fichier- > exécuter avec powershell.
la console continue d'afficher les messages d'erreur, même si l'exécution du script terminé.
avez-vous pensé à rediriger stdout et stderr vers un fichier ex:
./ascript.ps1 >journaux 2>&1
Note: Vous pouvez créer un script wrapper dans powershell qui appelle votre script powershell avec toutes les redirections nécessaires.
Un couple plus d'idées...Vous pouvez utiliser le démarrer-sommeil cmdlet à la fin de votre script pour vous donner assez de temps pour revoir l'erreur.
vous pourriez aussi pouvoir utiliser start-transcript pour enregistrer la session dans un fichier texte.
Créer run_ps_script.bat
fichier contenant
@PowerShell.exe -command "try { %1 } finally { read-host 'Press ENTER...' }"
et de le rendre le programme par défaut pour ouvrir PowerShell
scripts.