230 votes

Équivalent Powershell de bash esperluette (&) pour le forking / l'exécution de processus en arrière-plan

Dans bash, l'esperluette (&) peut être utilisée pour exécuter une commande en arrière-plan et renvoyer le contrôle interactif à l'utilisateur avant la fin de l'exécution de la commande. Existe-t-il une méthode équivalente pour ce faire à Powershell?

Exemple d'utilisation à bash:

  sleep 30 &
 

174voto

Bogdan Calmac Points 1228

Tant que la commande est un fichier exécutable ou un fichier qui est associé à un fichier exécutable, l'utilisation des Start-Processus (disponible à partir de v2):

Start-Process -NoNewWindow ping google.com

Vous pouvez également ajouter ce que une fonction dans votre profil:

function bg() {Start-Process -NoNewWindow @args}

et puis l'invocation devient:

bg ping google.com

À mon avis, le Début de l'Emploi est un overkill pour le cas d'utilisation simple de l'exécution d'un processus en arrière-plan:

  1. Start-Emploi n'ont pas accès à votre portée (car il s'exécute dans une session distincte). Vous ne pouvez pas faire de la "Start-Travail {bloc-notes $monfichier}"
  2. Start-Emploi ne permet pas de conserver le répertoire courant (car il s'exécute dans une session distincte). Vous ne pouvez pas faire de la "Start-Travail {bloc-notes myfile.txt}", où myfile.txt est dans le répertoire courant.
  3. La sortie n'est pas affichée automatiquement. Vous devez exécuter Recevoir des-Emploi avec l'ID de l'emploi en tant que paramètre.

REMARQUE: en ce qui Concerne votre premier exemple, "bg sommeil 30" ne marche pas car le sommeil est un Powershell commandlet. Démarrer le Processus ne fonctionne que lorsque vous avez réellement fourche d'un processus.

36voto

halr9000 Points 3012

Les quelques réponses à cette question.

  1. Vous ne pouvez pas le faire facilement dans la version 1
  2. Version 2 (aujourd'hui dans la communauté tech preview 2) a cette fonction, il est appelé un PSJob. Trouver plus à ce sujet ici ou ici.
  3. Vous pouvez effectivement le faire à la dure dans la v1, n'hésitez pas à avoir à elle, mais je n'ai jamais pris la peine.

35voto

Il semble que le bloc de script transmis à Start-Job ne soit pas exécuté avec le même répertoire actuel que la commande Start-Job , assurez-vous donc de spécifier le chemin complet en tant que de besoin.

Par exemple:

 Start-Job { C:\absolute\path\to\command.exe --afileparameter C:\absolute\path\to\file.txt }
 

23voto

Dustin Getz Points 8514
 ps2> start-job {start-sleep 20}
 

Je n'ai pas encore compris comment obtenir la sortie standard en temps réel, start-job vous oblige à interroger la sortie standard avec get-job

mise à jour: je ne pouvais pas commencer le travail pour faire facilement ce que je veux qui est fondamentalement le bash et l'opérateur. voici mon meilleur bidouille jusqu'à présent

 PS> notepad $profile #edit init script -- added these lines
function beep { write-host `a }
function ajp { start powershell {ant java-platform|out-null;beep} } #new window, stderr only, beep when done
function acjp { start powershell {ant clean java-platform|out-null;beep} }
PS> . $profile #re-load profile script
PS> ajp
 

0voto

Jeffery Hicks Points 356

J'ai utilisé la solution décrite ici http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry dans PowerShell v1.0. Ce sera certainement plus facile dans PowerShell v2.0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X