O ile polecenie jest plikiem wykonywalnym lub plikiem, który ma skojarzony plik wykonywalny, użyj Start-Process (dostępne od v2):
Start-Process -NoNewWindow ping google.com
Możesz również dodać to jako funkcję w swoim profilu:
function bg() {Start-Process -NoNewWindow @args}
a wtedy wezwanie staje się:
bg ping google.com
Moim zdaniem Start-Job jest przesadą w prostym przypadku uruchamiania procesu w tle:
- Start-Job nie ma dostępu do istniejącego zakresu (ponieważ działa w osobnej sesji). Nie możesz wykonać „Rozpocznij pracę {notepad $ myfile}”
- Start-Job nie zachowuje bieżącego katalogu (ponieważ działa w osobnej sesji). Nie można wykonać „Start-Job {notepad myfile.txt}”, gdzie mojplik.txt znajduje się w bieżącym katalogu.
- Dane wyjściowe nie są wyświetlane automatycznie. Musisz uruchomić Receive-Job z identyfikatorem zadania jako parametrem.
UWAGA: Jeśli chodzi o twój początkowy przykład, "bg sleep 30" nie zadziała, ponieważ sleep jest poleceniem Powershell. Start-Process działa tylko wtedy, gdy faktycznie rozwidlisz proces.
Start-Job
zostanie zabite, gdy powłoka PS zakończy działanie. Z drugiej strony wydaje się, że coś, co zaczęło się od,Start-Process
będzie nadal działać po zamknięciu powłoki PS. To jest duża różnica.Start-Process
, przetrwa on zakończenie powłoki, ale jeśli uruchomisz go z okna konsoli, pozostanie on powiązany z tym oknem, a zamknięcie okna zakończy proces.Start-Process
i tak to nie będzie działać:Start-Process {ping -n 1000 example.com > ping__example.com.txt }
. To samo zStart-Job
działa dobrze (chociaż musisz użyć pełnej ścieżki do pliku wyjściowego).Wydaje się, że przekazany blok skryptu
Start-Job
nie jest wykonywany w tym samym katalogu bieżącym, coStart-Job
polecenie, więc w razie potrzeby należy podać pełną ścieżkę.Na przykład:
źródło
jeszcze nie wymyśliłem, jak uzyskać stdout w czasie rzeczywistym, rozpoczęcie pracy wymaga sondowania stdout za pomocą get-job
aktualizacja: nie mogłem łatwo rozpocząć pracy, aby łatwo robić to, co chcę, czyli w zasadzie operator bash i. oto moja najlepsza jak dotąd hack
źródło
Start-Job { Write-Output 'Hello world' } | Receive-Job -Wait
Z PowerShell Core 6.0 możesz pisać
&
na końcu polecenia i będzie to równoważne z uruchomieniem potoku w tle w bieżącym katalogu roboczym .Nie jest to odpowiednik
&
w bash, to po prostu ładniejsza składnia dla bieżącej funkcji zadań PowerShell . Zwraca obiekt zadania, więc możesz użyć wszystkich innych poleceń, których używałbyś do zadań. Na przykładReceive-Job
:Jeśli chcesz wykonać kilka instrukcji w tle, możesz połączyć
&
operator wywołania ,{ }
blok skryptu i ten nowy&
operator w tle, jak tutaj:Oto więcej informacji ze stron dokumentacji:
z Co nowego w programie PowerShell Core 6.0 :
from about_operators / Ampersand operator w tle & :
źródło
Receive-Job 3
, ale nic się nie dzieje.fg
za przeniesienie pracy na * pierwszy plan .fg
w PowerShell :( Pamiętam, że szukałem, ale nie mogłem nic znaleźćMożesz użyć poleceń cmdlet zadań programu PowerShell, aby osiągnąć swoje cele.
W programie PowerShell dostępnych jest 6 poleceń cmdlet związanych z zadaniami.
Jeśli Cię to interesuje, możesz pobrać przykładowy sposób tworzenia zadania w tle w programie PowerShell
źródło
Możesz zrobić coś takiego.
A jeśli chcesz na to poczekać:
Wersja bonusowa na OSX lub Linux:
Przykładowy skrypt pinger, który mam. Argumenty są przekazywane jako tablica:
źródło
start
rozwidli proces i zwróci kontrolę rozmówcy. Więcej informacji tutajtl; dr
źródło
Z rozwiązania opisanego tutaj http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry korzystałem z powodzeniem w programie PowerShell v1.0. Na pewno będzie łatwiej w PowerShell v2.0.
źródło