À 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 exemple Receive-Job
:
C:\utils> ping google.com &
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
35 Job35 BackgroundJob Running True localhost Microsoft.PowerShell.M...
C:\utils> Receive-Job 35
Pinging google.com [172.217.16.14] with 32 bytes of data:
Reply from 172.217.16.14: bytes=32 time=11ms TTL=55
Reply from 172.217.16.14: bytes=32 time=11ms TTL=55
Reply from 172.217.16.14: bytes=32 time=10ms TTL=55
Reply from 172.217.16.14: bytes=32 time=10ms TTL=55
Ping statistics for 172.217.16.14:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 10ms, Maximum = 11ms, Average = 10ms
C:\utils>
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:
& { cd .\SomeDir\; .\SomeLongRunningOperation.bat; cd ..; } &
Voici quelques informations supplémentaires tirées des pages de documentation:
à partir de Quoi de neuf dans PowerShell Core 6.0 :
Prise en charge de l'arrière-plan des pipelines avec esperluette (&) (# 3360)
Le placement &
à la fin d'un pipeline entraîne l'exécution du pipeline en tant que travail PowerShell. Lorsqu'un pipeline est en arrière-plan, un objet de travail est renvoyé. Une fois que le pipeline s'exécute en tant que travail, toutes les *-Job
applets de commande standard peuvent être utilisées pour gérer le travail. Les variables (ignorant les variables spécifiques au processus) utilisées dans le pipeline sont automatiquement copiées dans le travail et Copy-Item $foo $bar &
fonctionnent donc. Le travail est également exécuté dans le répertoire courant au lieu du répertoire de base de l'utilisateur. Pour plus d'informations sur les travaux PowerShell, consultez about_Jobs .
à partir de l' opérateur about_operators / Ampersand background & :
Opérateur d'arrière-plan esperluette &
Exécute le pipeline avant celui-ci dans une tâche PowerShell. L'opérateur d'arrière-plan et d'esperluette agit de la même manière que «l'opérateur d'esperluette» UNIX qui exécute la commande avant lui en tant que processus d'arrière-plan. L'opérateur d'arrière-plan esperluette est construit au-dessus des travaux PowerShell, de sorte qu'il partage beaucoup de fonctionnalités avec Start-Job
. La commande suivante contient l'utilisation de base de l'opérateur d'arrière-plan esperluette.
Get-Process -Name pwsh &
Ceci est fonctionnellement équivalent à l'utilisation suivante de Start-Job
.
Start-Job -ScriptBlock {Get-Process -Name pwsh}
Comme il est fonctionnellement équivalent à utiliser Start-Job
, l'opérateur d'arrière-plan esperluette renvoie un Job
objet exactement comme Start-Job does
. Cela signifie que vous pouvez utiliser Receive-Job
et Remove-Job
tout comme vous le feriez si vous aviez l'habitude Start-Job
de démarrer le travail.
$job = Get-Process -Name pwsh &
Receive-Job $job
Production
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0.00 221.16 25.90 6988 988 pwsh
0 0.00 140.12 29.87 14845 845 pwsh
0 0.00 85.51 0.91 19639 988 pwsh
$job = Get-Process -Name pwsh &
Remove-Job $job
Pour plus d'informations sur les travaux PowerShell, consultez about_Jobs .
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 .