Selama perintahnya adalah file yang dapat dieksekusi atau file yang memiliki file yang dapat dieksekusi terkait, gunakan Mulai-Proses (tersedia dari v2):
Start-Process -NoNewWindow ping google.com
Anda juga dapat menambahkan ini sebagai fungsi di profil Anda:
function bg() {Start-Process -NoNewWindow @args}
dan kemudian doa menjadi:
bg ping google.com
Menurut pendapat saya, Start-Job adalah kerja keras untuk kasus penggunaan sederhana menjalankan proses di latar belakang:
- Start-Job tidak memiliki akses ke ruang lingkup Anda yang ada (karena berjalan dalam sesi terpisah). Anda tidak dapat melakukan "Start-Job {notepad $ myfile}"
- Start-Job tidak mempertahankan direktori saat ini (karena berjalan dalam sesi terpisah). Anda tidak dapat melakukan "Start-Job {notepad myfile.txt}" di mana myfile.txt berada di direktori saat ini.
- Output tidak ditampilkan secara otomatis. Anda perlu menjalankan Receive-Job dengan ID pekerjaan sebagai parameter.
CATATAN: Mengenai contoh awal Anda, "bg sleep 30" tidak akan berfungsi karena sleep adalah commandlet Powershell. Mulai-Proses hanya berfungsi ketika Anda benar-benar melakukan suatu proses.
Start-Job
akan terbunuh ketika shell PS keluar. Sebaliknya, sesuatu yang dimulai denganStart-Process
akan terus berjalan setelah PS shell keluar. Ini perbedaan utama .Start-Process
, skrip ini akan bertahan, tetapi jika Anda memulainya dari jendela konsol maka ia tetap terikat ke jendela itu dan menutup jendela itu akan menghentikan prosesnya.Start-Process
dan jadi ini akan tidak bekerja:Start-Process {ping -n 1000 example.com > ping__example.com.txt }
. Hal yang sama denganStart-Job
berfungsi dengan baik (meskipun Anda harus menggunakan path lengkap ke file output).Tampaknya blok skrip yang diteruskan ke
Start-Job
tidak dieksekusi dengan direktori saat ini sama denganStart-Job
perintah, jadi pastikan untuk menentukan jalur yang memenuhi syarat jika diperlukan.Sebagai contoh:
sumber
saya belum menemukan cara untuk mendapatkan stdout secara langsung, pekerjaan awal mengharuskan Anda untuk memilih stdout dengan mendapatkan pekerjaan
pembaruan: saya tidak dapat memulai pekerjaan dengan mudah melakukan apa yang saya inginkan yang pada dasarnya adalah bash & operator. inilah hack terbaik saya sejauh ini
sumber
Start-Job { Write-Output 'Hello world' } | Receive-Job -Wait
Dari PowerShell Core 6.0 Anda dapat menulis
&
di akhir perintah dan itu akan setara dengan menjalankan pipeline di latar belakang di direktori kerja saat ini .Ini tidak sama dengan
&
di bash, itu hanya sintaks yang lebih bagus untuk fitur pekerjaan PowerShell saat ini. Ini mengembalikan objek pekerjaan sehingga Anda dapat menggunakan semua perintah lain yang akan Anda gunakan untuk pekerjaan. Sebagai contohReceive-Job
:Jika Anda ingin menjalankan beberapa pernyataan di latar belakang, Anda dapat menggabungkan
&
operator panggilan ,{ }
blok skrip dan&
operator latar belakang baru ini seperti di sini:Berikut ini beberapa info dari halaman dokumentasi:
dari Apa yang Baru di PowerShell Core 6.0 :
dari about_operators / Ampersand operator latar belakang & :
sumber
Receive-Job 3
, tetapi tidak ada yang terjadi.fg
untuk membawa pekerjaan ke * foreground .fg
di powershell :( Saya ingat mencarinya, tetapi tidak dapat menemukan apa punAnda dapat menggunakan cmdlet pekerjaan PowerShell untuk mencapai tujuan Anda.
Ada 6 cmdlet terkait pekerjaan yang tersedia di PowerShell.
Jika menarik tentang hal itu, Anda dapat mengunduh sampel Cara membuat pekerjaan latar belakang di PowerShell
sumber
Anda dapat melakukan sesuatu seperti ini.
Dan jika Anda ingin menunggu untuk itu:
Bonus osx atau versi linux:
Contoh skrip pinger yang saya miliki. Args dilewatkan sebagai array:
sumber
start
akan memotong proses dan mengembalikan kontrol ke pemanggil. Info lebih lanjut di sinitl; dr
sumber
Saya telah menggunakan solusi yang dijelaskan di sini http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.hasil masuk dengan sukses di PowerShell v1.0. Ini pasti akan lebih mudah di PowerShell v2.0.
sumber