Пока команда является исполняемым файлом или файлом, имеющим связанный исполняемый файл, используйте Start-Process (доступно из v2):
Start-Process -NoNewWindow ping google.com
Вы также можете добавить это как функцию в свой профиль:
function bg() {Start-Process -NoNewWindow @args}
и тогда вызов становится:
bg ping google.com
На мой взгляд, Start-Job является излишним для простого варианта использования процесса в фоновом режиме:
- Start-Job не имеет доступа к существующей области (потому что он выполняется в отдельном сеансе). Вы не можете выполнить "Start-Job {notepad $ myfile}"
- Start-Job не сохраняет текущий каталог (потому что он запускается в отдельном сеансе). Вы не можете выполнить "Start-Job {notepad myfile.txt}", где myfile.txt находится в текущем каталоге.
- Вывод не отображается автоматически. Вам нужно запустить Receive-Job с идентификатором задания в качестве параметра.
ПРИМЕЧАНИЕ: Что касается вашего первоначального примера, «bg sleep 30» не будет работать, потому что sleep - это командлет Powershell. Start-Process работает только тогда, когда вы фактически разветвляете процесс.
Start-Job
что будет убит при выходе из оболочки PS. Напротив, кажется, что что-то началось сStart-Process
продолжения работы после выхода из оболочки PS. Это серьезная разница.Start-Process
его, он переживет завершение оболочки, но если вы запустили его из окна консоли, он останется привязанным к этому окну, и закрытие окна приведет к завершению процесса.Start-Process
и так этого не будет работать:Start-Process {ping -n 1000 example.com > ping__example.com.txt }
. То же самое сStart-Job
отлично работает (хотя вы должны использовать полный путь к выходному файлу).Кажется, что переданный в блок сценария
Start-Job
не выполняется с тем же текущим каталогом, что иStart-Job
команда, поэтому при необходимости обязательно укажите полный путь.Например:
источник
я еще не понял, как получить стандартный вывод в режиме реального времени, для начала работы требуется опросить стандартный вывод с помощью get-job
Обновление: я не мог начать работу, чтобы легко делать то, что я хочу, в основном это оператор bash &. вот мой лучший хак
источник
Start-Job { Write-Output 'Hello world' } | Receive-Job -Wait
Из PowerShell Core 6.0 вы можете писать
&
в конце команды, и это будет эквивалентно запуску вашего конвейера в фоновом режиме в текущем рабочем каталоге .Это не эквивалентно
&
в Баше, это просто лучше синтаксис для текущего PowerShell заданий функции. Он возвращает объект задания, поэтому вы можете использовать все остальные команды, которые вы использовали бы для заданий. НапримерReceive-Job
:Если вы хотите выполнить пару операторов в фоновом режиме, вы можете объединить
&
оператор вызова ,{ }
блок скрипта и этот новый&
оператор фона, как здесь:Вот еще немного информации со страниц документации:
из Что нового в PowerShell Core 6.0 :
из about_operators / Ampersand background operator & :
источник
Receive-Job 3
, но ничего не происходит.fg
для переноса работы на * передний план .fg
:( Я помню, что искал его, но ничего не смог найтиВы можете использовать командлеты PowerShell для достижения своих целей.
В PowerShell доступно 6 командлетов, связанных с работой.
Если вам интересно, вы можете скачать образец Как создать фоновое задание в PowerShell
источник
Вы можете сделать что-то вроде этого.
И если вы хотите ждать этого:
Бонусная версия для OSX или Linux:
Пример скрипта пингера у меня есть. Аргументы передаются в виде массива:
источник
start
разветвит процесс и вернет управление вызывающей стороне. Более подробная информация здесьТЛ; др
источник
Я успешно использовал описанное здесь решение http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry в PowerShell v1.0. Это определенно будет проще в PowerShell v2.0.
источник