В PowerShell Core 6.0 вы можете написать &
в конце команды, и это будет эквивалентно запуску вашего конвейера в фоновом режиме в текущем рабочем каталоге .
Это не эквивалентно &
в bash, это просто более приятный синтаксис для текущей функции PowerShell jobs . Он возвращает объект задания, поэтому вы можете использовать все остальные команды, которые вы использовали бы для заданий. Например 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>
Если вы хотите выполнить несколько операторов в фоновом режиме, вы можете объединить &
оператор вызова , { }
блок сценария и этот новый &
оператор фона как здесь:
& { cd .\SomeDir\; .\SomeLongRunningOperation.bat; cd ..; } &
Вот еще немного информации со страниц документации:
из Что нового в PowerShell Core 6.0 :
Поддержка фоновой обработки трубопроводов с амперсандом (&) (# 3360)
Если поставить &
в конце конвейера, конвейер будет запущен как задание PowerShell. Когда конвейер находится на заднем плане, возвращается объект задания. Когда конвейер запускается как задание, все стандартные командлеты *-Job
могут использоваться для управления заданием. Переменные (игнорирующие переменные, специфичные для процесса), используемые в конвейере, автоматически копируются в задание, поэтому Copy-Item $foo $bar &
просто работает. Задание также запускается в текущем каталоге вместо домашнего каталога пользователя. Для получения дополнительной информации о заданиях PowerShell см. about_Jobs .
из about_operators / Ampersand background operator & :
Фоновый оператор амперсанда &
Запускает конвейер перед ним в задании PowerShell. Фоновый оператор амперсанда действует аналогично «оператору амперсанда» в UNIX, который классно запускает команду перед ним как фоновый процесс. Фоновый оператор амперсанда построен на основе заданий PowerShell, поэтому он обладает многими функциональными возможностями Start-Job
. Следующая команда содержит основные сведения об использовании фонового оператора амперсанда.
Get-Process -Name pwsh &
Это функционально эквивалентно следующему использованию Start-Job
.
Start-Job -ScriptBlock {Get-Process -Name pwsh}
Поскольку это функционально эквивалентно использованию Start-Job
, фоновый оператор амперсанда возвращает объект Job
, такой же как Start-Job does
. Это означает, что вы можете использовать Receive-Job
и Remove-Job
так же, как если бы вы использовали Start-Job
для запуска задания.
$job = Get-Process -Name pwsh &
Receive-Job $job
выход
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
Подробнее о заданиях PowerShell см. about_Jobs .