2008-10-09 2 views
100

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

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

sleep 30 & 

ответ

29

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

  1. Вы не можете легко сделать это в версии 1
  2. версии 2 (в настоящее время в сообществе технологий просмотра 2) имеет эту функцию, это называется Job (ранее PSJob). Узнайте больше об этом here или here.
  3. Вы можете на самом деле сделать это the hard way в v1, не стесняйтесь иметь его, но я никогда не беспокоился.
+0

Эти решения, похоже, не работают с Windows 7. – Marcin 2011-05-22 10:07:43

+4

@Marcin - этот ответ был с 2008 года. В Windows 7, powershell 2.0 является RTM и имеет командлет «start-job» для фоновых заданий. – x0n 2011-06-23 20:39:27

+0

Не на моей Windows 7 это не так. – Marcin 2011-06-23 21:24:46

17
ps2> start-job {start-sleep 20} 

я еще не понял, как получить стандартный вывод в режиме реального времени, запуск задания требует опроса STDOUT с 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 
11

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

Например:

Start-Job { C:\absolute\path\to\command.exe --afileparameter C:\absolute\path\to\file.txt } 
76

Пока команда является исполняемым или файл, который имеет соответствующий исполняемый файл, используйте 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» не будет работать, потому что сон - это командный файл Powershell. Start-Process работает только тогда, когда вы фактически выполняете процесс.

5

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

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

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

Если интересно об этом, вы можете скачать образец How to create background job in PowerShell