Эквивалент Powershell амперсанда bash (&) для разветвления/запуска фоновых процессов

Начиная с PowerShell Core powershell 6.0 вы можете писать & в конце powershell команды, и это будет эквивалентно powershell запуску конвейера в фоновом режиме в текущем рабочем каталоге.

Это не powershell эквивалент & в bash, это просто windows-powershell более удобный синтаксис для powershell текущей функции PowerShell windows-powershell jobs. Он возвращает объект задания, поэтому windows-powershell вы можете использовать все windows-powershell остальные команды, которые 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>

Если powershell вы хотите выполнить несколько powershell операторов в фоновом режиме, вы powershell можете объединить & call operator, { } script block и этот windows-powershell новый & background operator, как здесь:

& { cd .\SomeDir\; .\SomeLongRunningOperation.bat; cd ..; } &

Дополнительная windows-powershell информация со страниц документации:

из powershell What's New in PowerShell Core 6.0:

Поддержка фоновой обработки конвейеров с помощью амперсанда (&) (# 3360)

Размещение & в конце конвейера powershell приводит к тому, что конвейер windows-powershell запускается как задание PowerShell. Когда windows-powershell конвейер находится в фоновом windows-powershell режиме, возвращается объект windows-powershell задания. Когда конвейер запущен windows-powershell как задание, все стандартные windows-powershell командлеты *-Job можно использовать powershell для управления заданием. Переменные powershell (без учета переменных, зависящих powershell от процесса), используемые windows-powershell в конвейере, автоматически windows-powershell копируются в задание, поэтому windows-powershell Copy-Item $foo $bar & просто работает. Задание powershell также выполняется в текущем powershell каталоге, а не в домашнем powershell каталоге пользователя. Дополнительные powershell сведения о заданиях PowerShell powershell см. На странице about_Jobs.

из about_operators / Ampersand background operator &:

Оператор фона амперсанда &

Запускает powershell конвейер перед ним в задании powershell PowerShell. Фоновый оператор powershell амперсанда действует аналогично powershell «оператору амперсанда» UNIX, который, как windows-powershell известно, запускает команду powershell перед ним в качестве фонового windows-powershell процесса. Фоновый оператор windows-powershell амперсанда построен на основе powershell заданий PowerShell, поэтому windows-powershell он имеет много общего с Start-Job. Следующая windows-powershell команда описывает базовое powershell использование фонового оператора powershell амперсанда.

Get-Process -Name pwsh &

Функционально powershell это эквивалентно следующему windows-powershell использованию Start-Job.

Start-Job -ScriptBlock {Get-Process -Name pwsh}

Поскольку powershell он функционально эквивалентен windows-powershell использованию Start-Job, оператор powershell фона амперсанда возвращает powershell объект Job, как и Start-Job does. Это означает, что powershell вы можете использовать Receive-Job и windows-powershell Remove-Job так же, как если бы вы использовали powershell 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 получения дополнительной windows-powershell информации о заданиях PowerShell powershell см. about_Jobs.

powershell

2022-10-09T06:14:08+00:00