Sunday, February 12, 2017

Démarrer Process Waitforexit Powershell

Im essayant d'exécuter un programme de PowerShell, attendez la sortie, alors obtenez l'accès à la ExitCode, mais n'ayant pas beaucoup de chance. Je ne veux pas utiliser Wait avec Start Process, comme j'ai besoin d'un traitement pour continuer en arrière plan. Voici un script de test simplifié: L'exécution de ce script entraînera le démarrage du bloc notes. Après avoir fermé manuellement, le code de sortie sera imprimé et il recommencera sans utiliser wait. Aucun ExitCode n'est fourni quand il est stoppé: Je dois être capable d'effectuer un traitement supplémentaire entre le démarrage du programme et l'attente pour qu'il quitte, donc je ne peux pas utiliser Attendre. N'importe quelle idée comment je peux faire ceci et avoir toujours accès à la propriété. ExitCode de ce processus a demandé Apr 21 12 à 19:23 Il ya deux choses à retenir ici. L'une consiste à ajouter l'argument PassThru et deux à ajouter l'argument Wait. Vous devez ajouter l'argument d'attente à cause de ce défaut connect. microsoftPowerShellfeedbackdetails520554start process ne pas retour exitcode propriété Une fois que vous faites cet objet un processus est passé en arrière et vous pouvez regarder la propriété ExitCode de cet objet. Voici un exemple: Si vous exécutez sans PassThru ou Attendre, il affichera nothing. Managing Processus en PowerShell Plusieurs personnes ont demandé récemment au sujet de la façon de gérer les processus en PowerShell. Ce blog devrait répondre à un certain nombre de ces questions. Comme on pourrait s'y attendre de la partie 8220shell8221 de PowerShell, vous don8217t ont à faire quelque chose de spécial pour démarrer un processus. Dans un langage de programmation tel que VBScript, vous devez faire quelque chose d'assez complexe comme: strComputer 8220,8221 Set objWMIService GetObject (8220winmgmts: 8221 Ampères 8220 8221 Ampères ampli strComputer 8220rootcimv28221) Set objStartup objWMIService. Get (8220Win32ProcessStartup8221) Set objConfig objStartup. SpawnInstance Set objProcess GetObject (8220winmgmts: rootcimv2: Win32Process8221) objProcess. Create 8220Notepad. exe8221, Null, objConfig, intProcessID mais coquilles (PowerShell, cmd. exe, bash, etc.), vous pouvez simplement commencer un programme comme le bloc notes en tapant simplement 8220notepad8221 comme indiqué. Maintenant, vous remarquerez que lorsque vous le faites, le shell retourne immédiatement et vous invite à la commande suivante. C'est parce que le bloc notes est un processus GUI win32 et s'exécute en arrière plan. D'autre part, si vous démarrez une application console comme 8220ping. exe8221, PowerShell attendra jusqu'à ce que ce processus soit terminé. Mais si je ne veux attendre que le processus Win32 En cmd. exe, you8217d faire avec 8220start wait8221 mais cette commande ne sont pas (directement) disponible dans PowerShell. Alors que faisons nous PowerShell exécute directement des exécutables. S'il attend que le processus se termine, le code de sortie est laissé dans LASTEXITCODE. Maintenant, si un exécutable Win32 est la dernière commande d'un pipeline et n'est pas redirigé, le processus s'exécutera en arrière plan. Toutefois, si vous pipe de sa sortie en quelque chose, puis PowerShell attendra la commande de sortir. Il s'agit donc d'une simple (si pas intuitive) d'attendre pour un processus d'interface graphique à la sortie. Sinon, si le processus est déjà en cours, vous pouvez utiliser Get Process pour récupérer les informations nécessaires, puis faire un WaitForExit () sur cet objet. Voici un exemple un peu plus sophistiqué où nous ouvrons un document au lieu de démarrer un processus. Cette fois we8217ll trouver le processus par titre de fenêtre au lieu de par le nom de l'exécutable Malheureusement la recherche d'un processus signifie toujours que vous pouvez trouver le mauvais processus. Idéalement, vous aimeriez obtenir l'objet Process directement. Ainsi, pour une gestion plus précise des processus, vous devrez utiliser la classe System. Diagnostics. Process et démarrer les processus vous même. Par exemple, vous pouvez utiliser diagnostics. process :: Start () pour attendre un processus: Notez l'utilisation de 8220pwdfoo. txt8221 pour spécifier le chemin complet du fichier. C'est parce que PowerShell maintient sa propre idée du répertoire courant. (Cette note s'applique à l'utilisation d'une API qui accède au système de fichiers dont vous avez besoin pour lui donner un chemin absolu.) Maintenant, nous commençons à revenir au niveau de complexité que vous trouvez dans un langage de programmation. Cependant, vous avez également toute la puissance de ces langues. Voici un exemple de script 8220background. ps18221 qui vous permettra d'exécuter un scriptblock détaché dans une fenêtre séparée (ou dans la même fenêtre si vous spécifiez le paramètre inconsole.) Ce script let8217s vous faire des choses dans PowerShell que vous pouvez faire à partir de cmd. exe, mais peut Bien que PowerShell ne dispose pas d'une commande de démarrage, cmd. exe le fait, vous pouvez faire une start wait by doing Et, last but not least, les extensions de la communauté PowerShell inclut Vous pouvez obtenir une liste de ces fonctionnalités à l'adresse suivante: Bruce Payette MSFT


No comments:

Post a Comment