Tant que la commande est un exécutable ou un fichier associé à un exécutable, utilisez Start-Process (disponible à partir de la v2):
Start-Process -NoNewWindow ping google.com
Vous pouvez également l'ajouter en tant que fonction dans votre profil:
function bg() {Start-Process -NoNewWindow @args}
puis l'invocation devient:
bg ping google.com
À mon avis, Start-Job est une exagération pour le cas d'utilisation simple de l'exécution d'un processus en arrière-plan:
- Start-Job n'a pas accès à votre étendue existante (car elle s'exécute dans une session distincte). Vous ne pouvez pas faire "Start-Job {notepad $ myfile}"
- Start-Job ne conserve pas le répertoire courant (car il s'exécute dans une session distincte). Vous ne pouvez pas faire "Start-Job {notepad myfile.txt}" où myfile.txt est dans le répertoire courant.
- La sortie ne s'affiche pas automatiquement. Vous devez exécuter Receive-Job avec l'ID du travail comme paramètre.
REMARQUE: En ce qui concerne votre exemple initial, «bg sleep 30» ne fonctionnera pas car sleep est une commande Powershell. Start-Process ne fonctionne que lorsque vous créez un processus.
Start-Job
sera tué lorsque le shell PS sortira. En revanche, il semble que quelque chose qui a commencé avecStart-Process
continuera à fonctionner après la sortie du shell PS. C'est une différence majeure .Start-Process
, il survivra à la fin du shell, mais si vous l'avez démarré à partir d'une fenêtre de console, il reste lié à cette fenêtre et la fermeture de la fenêtre mettra fin au processus.Start-Process
et donc cela ne fonctionnera pas:Start-Process {ping -n 1000 example.com > ping__example.com.txt }
. La même chose avecStart-Job
fonctionne bien (même si vous devez utiliser le chemin complet vers le fichier de sortie).Il semble que le bloc de script passé à
Start-Job
n'est pas exécuté avec le même répertoire courant que laStart-Job
commande, assurez-vous donc de spécifier un chemin complet si nécessaire.Par exemple:
la source
je n'ai pas encore compris comment obtenir stdout en temps réel, start-job vous oblige à interroger stdout avec get-job
mise à jour: je ne pouvais pas démarrer le travail pour faire facilement ce que je veux, qui est essentiellement l'opérateur bash &. voici mon meilleur hack jusqu'à présent
la source
Start-Job { Write-Output 'Hello world' } | Receive-Job -Wait
À partir de PowerShell Core 6.0, vous pouvez écrire
&
à la fin de la commande et cela équivaudra à exécuter votre pipeline en arrière-plan dans le répertoire de travail actuel .Ce n'est pas équivalent à
&
dans bash, c'est juste une syntaxe plus agréable pour la fonctionnalité de tâches PowerShell actuelle . Il renvoie un objet de travail afin que vous puissiez utiliser toutes les autres commandes que vous utiliseriez pour les travaux. Par exempleReceive-Job
:Si vous souhaitez exécuter quelques instructions en arrière-plan, vous pouvez combiner l'
&
opérateur d'appel , le{ }
bloc de script et ce nouvel&
opérateur d'arrière-plan comme ici:Voici quelques informations supplémentaires tirées des pages de documentation:
à partir de Quoi de neuf dans PowerShell Core 6.0 :
à partir de l' opérateur about_operators / Ampersand background & :
la source
Receive-Job 3
, mais rien ne se passe.fg
pour mettre le travail au premier plan * .fg
dans PowerShell: (Je me souviens l'avoir cherché, mais jeVous pouvez utiliser les applets de commande PowerShell pour atteindre vos objectifs.
Il existe 6 applets de commande liées au travail disponibles dans PowerShell.
Si cela vous intéresse, vous pouvez télécharger l'exemple Comment créer un travail d'arrière-plan dans PowerShell
la source
Vous pouvez faire quelque chose comme ça.
Et si vous voulez l'attendre:
Bonus version OSX ou Linux:
Exemple de script de pinger que j'ai. Les arguments sont passés sous forme de tableau:
la source
start
va bifurquer le processus et retourner le contrôle à l'appelant. Plus d'infos icitl; dr
la source
J'ai utilisé la solution décrite ici http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry avec succès dans PowerShell v1.0. Ce sera certainement plus facile dans PowerShell v2.0.
la source