Bash'da ve işareti (&), arka planda bir komut çalıştırmak ve komutun çalışması bitmeden önce kullanıcıya etkileşimli kontrolü döndürmek için kullanılabilir. Powershell'de bunu yapmanın eşdeğer bir yöntemi var mı?
Bash kullanım örneği:
sleep 30 &
Bash'da ve işareti (&), arka planda bir komut çalıştırmak ve komutun çalışması bitmeden önce kullanıcıya etkileşimli kontrolü döndürmek için kullanılabilir. Powershell'de bunu yapmanın eşdeğer bir yöntemi var mı?
Bash kullanım örneği:
sleep 30 &
Yanıtlar:
Komut bir yürütülebilir dosya veya ilişkilendirilmiş bir yürütülebilir dosyaya sahip bir dosya olduğu sürece, Start-Process (v2'den edinilebilir) kullanın:
Start-Process -NoNewWindow ping google.com
Bunu profilinizde bir işlev olarak da ekleyebilirsiniz:
function bg() {Start-Process -NoNewWindow @args}
ve sonra çağırma olur:
bg ping google.com
Kanımca, Start-Job, arka planda bir işlem yürütmenin basit kullanım durumu için aşırıya kaçmadır:
NOT: İlk örneğinizle ilgili olarak, uyku bir Powershell komut dosyası olduğu için "bg sleep 30" çalışmaz. Başlatma İşlemi yalnızca bir işlemi gerçekten çatalladığınızda çalışır.
Start-Process
, kabuk sonlandırmasından sağ çıkacaktır, ancak bir konsol penceresinden başlattıysanız, o pencereye bağlı kalır ve pencereyi kapatmak işlemi sonlandırır.
Start-Process
ve bu EDİLMEYEN işin bu yüzden: Start-Process {ping -n 1000 example.com > ping__example.com.txt }
. Aynı şey Start-Job
iyi çalışır (ancak çıkış dosyasının tam yolunu kullanmanız gerekir).
Aktarılan komut dosyası bloğunun komutla Start-Job
aynı geçerli dizinde yürütülmediği anlaşılıyor Start-Job
, bu nedenle gerekirse tam yol belirttiğinizden emin olun.
Örneğin:
Start-Job { C:\absolute\path\to\command.exe --afileparameter C:\absolute\path\to\file.txt }
ps2> start-job {start-sleep 20}
henüz gerçek zamanlı olarak stdout almak için nasıl anlamadım, başlangıç-iş almak stdout almak-iş gerektirir
Güncelleme: Temelde bash ve operatör olan istediğimi kolayca yapmak için işe başlayamadım. işte şimdiye kadarki en iyi hack'im
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'dan &
komutun sonunda yazabilirsiniz ve mevcut çalışma dizininde boru hattını arka planda çalıştırmaya eşdeğer olacaktır .
Bu &
bash ile eşdeğer değil , mevcut PowerShell işleri özelliği için sadece daha hoş bir sözdizimi . Bir iş nesnesi döndürür, böylece işler için kullanacağınız diğer tüm komutları kullanabilirsiniz. Örneğin 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>
Arka planda birkaç ifade yürütmek istiyorsanız, &
çağrı operatörünü , { }
komut dosyası bloğunu ve bu yeni &
arka plan operatörünü aşağıdaki gibi birleştirebilirsiniz:
& { cd .\SomeDir\; .\SomeLongRunningOperation.bat; cd ..; } &
Doküman sayfalarından biraz daha bilgi:
dan PowerShell Çekirdek 6.0 Neler Yeni :
Ve işareti ile boru hatlarının arka planını destekleme (&) (# 3360)
&
Bir boru hattının sonuna koymak , boru hattının bir PowerShell işi olarak çalıştırılmasına neden olur. Bir ardışık düzen arka planlandığında, bir iş nesnesi döndürülür. Boru hattı bir iş olarak çalıştığında*-Job
, işi yönetmek için tüm standart cmdlet'ler kullanılabilir. Boru hattında kullanılan değişkenler (işleme özgü değişkenleri yok saymak) işe otomatik olarak kopyalanır, böyleceCopy-Item $foo $bar &
çalışır. İş ayrıca kullanıcının ana dizini yerine geçerli dizinde çalıştırılır. PowerShell işleri hakkında daha fazla bilgi için, bkz. About_Jobs .
den about_operators / Ve işareti arka operatörü ve :
Ve işareti arka plan operatörü &
Boru hattını bir PowerShell işinden önce çalıştırır. Ve işareti arka plan işleci, komutu arka planda bir işlem olarak yürüten UNIX "ve işareti işlecine" benzer şekilde davranır. Ve işareti arka plan operatörü, PowerShell işlerinin üzerine inşa edilmiştir, böylece birçok işlevselliği paylaşır
Start-Job
. Aşağıdaki komut, ve işareti arka plan işlecinin temel kullanımını içerir.Get-Process -Name pwsh &
Bu, işlevsel olarak aşağıdaki kullanımıyla eşdeğerdir
Start-Job
.
Start-Job -ScriptBlock {Get-Process -Name pwsh}
İşlevsel olarak kullanıma eşdeğer olduğundan
Start-Job
, ve işareti arka plan operatörüJob
tıpkı bir nesneyi döndürürStart-Job does
. Kullanmak edebiliyoruz Bu araçlarReceive-Job
veRemove-Job
sadece kullandığınız olsaydı yaptığınız gibiStart-Job
işe başlamak için.$job = Get-Process -Name pwsh & Receive-Job $job
Çıktı
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 işleri hakkında daha fazla bilgi için bkz. About_Jobs .
Receive-Job 3
, ama hiçbir şey olmuyor.
fg
benzer şekilde almayı umuyordum .
fg
:( Aradığımı hatırlıyorum, ancak hiçbir şey bulamadım
Hedeflerinize ulaşmak için PowerShell iş cmdlet'lerini kullanabilirsiniz.
PowerShell'de işle ilgili 6 cmdlet vardır.
Bu konuda ilginçseniz, PowerShell'de arka plan işi nasıl oluşturulur örneğini indirebilirsiniz
Böyle bir şey yapabilirsiniz.
$a = start-process -NoNewWindow powershell {timeout 10; 'done'} -PassThru
Ve beklemek isterseniz:
$a | wait-process
Bonus osx veya linux versiyonu:
$a = start-process pwsh '-c',{start-sleep 5; 'done'} -PassThru
Örnek pinger betiğim var. Bağımsız değişkenler bir dizi olarak iletilir:
$1 = start -n powershell pinger,comp001 -pa
start
işlemi çatallar ve kontrolü arayana geri gönderir. Daha fazla bilgi burada
tl; Dr.
Start-Process powershell { sleep 30 }
Burada açıklanan çözümü http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry PowerShell v1.0'da başarıyla kullandım . PowerShell v2.0'da kesinlikle daha kolay olacak.
Start-Job
PS kabuğu çıktığında bir şey öldürülecek. Buna karşılıkStart-Process
, PS kabuğu çıktıktan sonra bir şeylerin çalışmaya devam edeceği görülüyor . Bu büyük bir fark.