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

powershell

103941 просмотра

9 ответа

14775 Репутация автора

В bash амперсанд (&) можно использовать для запуска команды в фоновом режиме и возврата пользователю интерактивного управления до завершения выполнения команды. Есть ли эквивалентный способ сделать это в Powershell?

Пример использования в bash:

 sleep 30 &
Автор: eddiegroves Источник Размещён: 09.10.2008 01:16

Ответы (9)


37 плюса

7149 Репутация автора

Решение

Есть несколько ответов на этот вопрос.

  1. Вы не можете легко сделать это в версии 1
  2. Версия 2 (теперь в Community Tech Preview 2) имеет эту функцию, она называется Job (ранее PSJob). Узнайте больше об этом здесь или здесь .
  3. Вы действительно можете сделать это трудным путем в v1, не стесняйтесь, но я никогда не беспокоился.
Автор: halr9000 Размещён: 09.10.2008 03:10

0 плюса

290 Репутация автора

Я успешно использовал описанное здесь решение http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry в PowerShell v1.0. Это определенно будет проще в PowerShell v2.0.

Автор: Jeffery Hicks Размещён: 09.10.2008 10:55

19 плюса

13535 Репутация автора

ps2> start-job {start-sleep 20}

я еще не выяснил, как получить стандартный вывод в реальном времени, для начала работы требуется опросить стандартный вывод с помощью get-job

Обновление: я не мог начать работу, чтобы легко делать то, что я хочу, в основном это оператор bash &. вот мой лучший хак

PS> notepad $profile #edit init script -- added these lines
function beep { write-host `a }
function ajp { start powershell {ant java-platform|out-null;beep} } #new window, stderr only, beep when done
function acjp { start powershell {ant clean java-platform|out-null;beep} }
PS> . $profile #re-load profile script
PS> ajp
Автор: Dustin Getz Размещён: 23.06.2011 07:42

20 плюса

15999 Репутация автора

Кажется, что переданный в блок сценария Start-Jobне выполняется с тем же текущим каталогом, что и Start-Jobкоманда, поэтому при необходимости обязательно укажите полный путь.

Например:

Start-Job { C:\absolute\path\to\command.exe --afileparameter C:\absolute\path\to\file.txt }
Автор: Gian Marco Gherardi Размещён: 07.07.2012 06:19

109 плюса

4751 Репутация автора

Пока команда является исполняемым файлом или файлом, имеющим связанный исполняемый файл, используйте Start-Process (доступно из v2):

Start-Process -NoNewWindow ping google.com

Вы также можете добавить это как функцию в свой профиль:

function bg() {Start-Process -NoNewWindow @args}

и тогда вызов становится:

bg ping google.com

На мой взгляд, Start-Job является излишним для простого варианта использования процесса в фоновом режиме:

  1. Start-Job не имеет доступа к существующей области (потому что он выполняется в отдельном сеансе). Вы не можете выполнить "Start-Job {notepad $ myfile}"
  2. Start-Job не сохраняет текущий каталог (потому что он запускается в отдельном сеансе). Вы не можете выполнить «Start-Job {notepad myfile.txt}», где myfile.txt находится в текущем каталоге.
  3. Вывод не отображается автоматически. Вам нужно запустить Receive-Job с идентификатором задания в качестве параметра.

ПРИМЕЧАНИЕ: Что касается вашего первоначального примера, «bg sleep 30» не будет работать, потому что sleep - это командлет Powershell. Start-Process работает только тогда, когда вы фактически разветвляете процесс.

Автор: Bogdan Calmac Размещён: 05.12.2012 05:48

12 плюса

484 Репутация автора

Вы можете использовать командлеты PowerShell для достижения своих целей.

В PowerShell доступно 6 командлетов, связанных с работой.

  • Найти работу
    • Получает фоновые задания Windows PowerShell, которые выполняются в текущем сеансе
  • Receive-Job
    • Получает результаты фоновых заданий Windows PowerShell в текущем сеансе
  • Remove-Job
    • Удаляет фоновое задание Windows PowerShell.
  • Start-Job
    • Запускает фоновое задание Windows PowerShell
  • Stop-Job
    • Останавливает фоновое задание Windows PowerShell
  • Wait-Job
    • Подавляет командную строку до тех пор, пока одно или все фоновые задания Windows PowerShell, запущенные в сеансе, не будут завершены

Если вам интересно, вы можете скачать образец Как создать фоновое задание в PowerShell

Автор: Eric Размещён: 09.11.2016 09:13

8 плюса

12571 Репутация автора

Из 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 .

Автор: Mariusz Pawelski Размещён: 22.12.2018 12:18

0 плюса

3491 Репутация автора

Вы можете сделать что-то вроде этого.

$a = start-process -NoNewWindow powershell {timeout 10; 'done'} -PassThru

done

И если вы хотите подождать этого:

$a | wait-process

Бонусная версия для OSX или Linux:

$a = start-process pwsh '-c',{start-sleep 5; 'done'} -PassThru 
Автор: js2010 Размещён: 10.07.2019 03:32

0 плюса

26 Репутация автора

ТЛ; др

Start-Process powershell { sleep 30 }
Автор: bence of outer space Размещён: 05.09.2019 03:09
Вопросы из категории :
32x32