Из PowerShell Core 6.0 вы можете писать &
в конце команды, и это будет эквивалентно запуску вашего конвейера в фоновом режиме в текущем рабочем каталоге .
Это не эквивалентно &
в Баше, это просто лучше синтаксис для текущего PowerShell заданий функции. Он возвращает объект задания, поэтому вы можете использовать все остальные команды, которые вы использовали бы для заданий. Например 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 .
Start-Job
что будет убит при выходе из оболочки PS. Напротив, кажется, что что-то началось сStart-Process
продолжения работы после выхода из оболочки PS. Это серьезная разница.