Відповіді:
Поки команда є виконуваним файлом або файлом, який має асоційований виконуваний файл, використовуйте Start-Process (доступний від v2):
Start-Process -NoNewWindow ping google.com
Ви також можете додати це як функцію у своєму профілі:
function bg() {Start-Process -NoNewWindow @args}
і тоді виклик стає:
bg ping google.com
На мою думку, Start-Job - це надмірний набір для простого використання для запуску процесу у фоновому режимі:
ПРИМІТКА. Що стосується вашого початкового прикладу, "bg sleep 30" не буде працювати, оскільки сон - це команда Powershell. Start-Process працює лише тоді, коли ви фактично розщедрили процес.
Start-Process
, він переживе завершення оболонки, але якщо ви запустили його з вікна консолі, він залишається прив’язаним до цього вікна, а закриття вікна завершить процес.
Start-Process
і так цього не буде працювати: Start-Process {ping -n 1000 example.com > ping__example.com.txt }
. Те ж саме і з Start-Job
відмінно працює (хоча вам доведеться використовувати повний шлях до вихідного файлу).
Здається, що переданий блок сценарію Start-Job
не виконується тим самим поточним каталогом, що і Start-Job
команда, тому обов'язково вкажіть повністю кваліфікований шлях, якщо потрібно.
Наприклад:
Start-Job { C:\absolute\path\to\command.exe --afileparameter C:\absolute\path\to\file.txt }
ps2> start-job {start-sleep 20}
я ще не зрозумів, як отримати stdout в режимі реального часу, старт-робота вимагає від вас опитувати stdout за допомогою get-job
оновлення: я не міг розпочати роботу, щоб легко робити те, що я хочу, а це в основному bash & operator. ось мій найкращий хак до цих пір
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
Start-Job { Write-Output 'Hello world' } | Receive-Job -Wait
З 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 6.0 Ядра :
Підтримка фонового покриття трубопроводів амперсандом (&) (# 3360)
Поміщення
&
в кінці трубопроводу призводить до того, що конвеєр буде працювати як PowerShell. Коли трубопровід є фоновим, об'єкт завдання повертається. Після того як конвеєр працює як робота, всі стандартні*-Job
командлети можуть бути використані для управління роботою. Змінні (ігнорування змінних, що стосуються певного процесу), що використовуються в конвеєрі, автоматично копіюються в завдання, так що цеCopy-Item $foo $bar &
просто працює. Завдання також виконується в поточному каталозі замість домашнього каталогу користувача. Щоб отримати докладнішу інформацію про завдання PowerShell, перегляньте сторінку about_Jobs .
від about_operators / фон оператора Ampersand & :
Оператор фону Ampersand &
Запускає трубопровід перед ним у роботі PowerShell. Оператор фону ampersand діє подібно до "оператора ampersand" UNIX, який чудово виконує команду перед ним як фоновий процес. Фоновий оператор ampersand побудований на основі завдань PowerShell, тому він має багато функціональних можливостей
Start-Job
. Наступна команда містить основне використання оператора фону ampersand.Get-Process -Name pwsh &
Це функціонально еквівалентно наступному використанню
Start-Job
.
Start-Job -ScriptBlock {Get-Process -Name pwsh}
Оскільки він функціонально еквівалентний використанню
Start-Job
, оператор фону ampersand повертає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 .
Receive-Job 3
, але нічого не відбувається.
fg
для виведення роботи на передній план * .
fg
у powershell немає подібного: схоже, я шукав його, але нічого не міг знайти
Ви можете використовувати командлети для роботи PowerShell для досягнення своїх цілей.
У PowerShell доступно 6 командлетів, пов'язаних з роботою.
Якщо цікаво про це, ви можете завантажити зразок Як створити фонове завдання в PowerShell
Можна зробити щось подібне.
$a = start-process -NoNewWindow powershell {timeout 10; 'done'} -PassThru
А якщо ви хочете дочекатися цього:
$a | wait-process
Версія Bonus osx або linux:
$a = start-process pwsh '-c',{start-sleep 5; 'done'} -PassThru
Приклад сценарію pinger у мене є. Аргументи передаються як масив:
$1 = start -n powershell pinger,comp001 -pa
тл; д-р
Start-Process powershell { sleep 30 }
Я успішно використовував описане тут рішення http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry успішно в PowerShell v1.0. У PowerShell v2.0 це, безумовно, буде простіше.
Start-Job
цього, буде вбито, коли оболонка PS вийде. На противагу цьому, здається, що щось, розпочате зStart-Process
, продовжить працювати після закінчення роботи оболонки PS. Це головна різниця.