बैश में एम्परसेंड (&) का इस्तेमाल बैकग्राउंड में कमांड चलाने के लिए किया जा सकता है और कमांड के रनिंग खत्म होने से पहले यूजर को इंटरेक्टिव कंट्रोल लौटा सकता है। क्या पॉवरशेल में ऐसा करने का एक समान तरीका है?
बाश में उपयोग का उदाहरण:
sleep 30 &
बैश में एम्परसेंड (&) का इस्तेमाल बैकग्राउंड में कमांड चलाने के लिए किया जा सकता है और कमांड के रनिंग खत्म होने से पहले यूजर को इंटरेक्टिव कंट्रोल लौटा सकता है। क्या पॉवरशेल में ऐसा करने का एक समान तरीका है?
बाश में उपयोग का उदाहरण:
sleep 30 &
जवाबों:
जब तक कमांड एक निष्पादन योग्य या एक फ़ाइल है जिसमें एक संबद्ध निष्पादन योग्य है, स्टार्ट-प्रोसेस (v2 से उपलब्ध) का उपयोग करें :
Start-Process -NoNewWindow ping google.com
आप इसे अपनी प्रोफ़ाइल में एक फ़ंक्शन के रूप में भी जोड़ सकते हैं:
function bg() {Start-Process -NoNewWindow @args}
और फिर आह्वान हो जाता है:
bg ping google.com
मेरी राय में, स्टार्ट-जॉब पृष्ठभूमि में एक प्रक्रिया चलाने के सरल उपयोग के मामले में एक ओवरकिल है:
नोट: अपने प्रारंभिक उदाहरण के संबंध में, "bg नींद 30" काम नहीं करेगा क्योंकि नींद एक Powershell कमांडलेट है। स्टार्ट-प्रोसेस तभी काम करता है जब आप वास्तव में एक प्रक्रिया के लिए कांटा करते हैं।
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}
मुझे अभी तक यह पता नहीं चला है कि रियलटाइम में स्टडआउट कैसे प्राप्त किया जाता है, स्टार्ट-जॉब के लिए आपको जॉब के साथ स्टडआउट की आवश्यकता होती है
अद्यतन: मैं शुरू नहीं कर सकता आसानी से मैं क्या करना चाहते हैं जो मूल रूप से bash और ऑपरेटर है। यहाँ मेरा अब तक का सबसे अच्छा हैक है
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 से आप &
कमांड के अंत में लिखने में सक्षम हैं और यह वर्तमान कार्यशील निर्देशिका में आपको पृष्ठभूमि में पाइपलाइन चलाने के बराबर होगा ।
यह &
बाश के बराबर नहीं है , यह वर्तमान पॉवरशेल नौकरियों की सुविधा के लिए केवल एक अच्छा वाक्यविन्यास है । यह एक नौकरी वस्तु देता है ताकि आप अन्य सभी कमांड का उपयोग कर सकें जो आप नौकरियों के लिए उपयोग करेंगे। उदाहरण के लिए 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) के साथ पाइपलाइनों की समर्थन पृष्ठभूमि
&
एक पाइपलाइन के अंत में डालने से पाइपलाइन को पावरस्ले जॉब के रूप में चलाया जाता है। जब एक पाइपलाइन की पृष्ठभूमि होती है, तो एक नौकरी की वस्तु वापस आ जाती है। एक बार पाइपलाइन एक नौकरी के रूप में चल रही है, सभी मानक*-Job
cmdlets का उपयोग नौकरी का प्रबंधन करने के लिए किया जा सकता है। पाइप लाइन में उपयोग किए जाने वाले वेरिएबल्स (प्रक्रिया-विशिष्ट चर की अनदेखी) स्वचालित रूप से काम करने के लिए कॉपी किए जाते हैं इसलिएCopy-Item $foo $bar &
बस काम करता है। नौकरी को उपयोगकर्ता की होम निर्देशिका के बजाय वर्तमान निर्देशिका में भी चलाया जाता है। PowerShell नौकरियों के बारे में अधिक जानकारी के लिए, about_Jobs देखें ।
से about_operators / एम्पसेंड पृष्ठभूमि ऑपरेटर और :
Ampersand पृष्ठभूमि ऑपरेटर और
PowerShell कार्य में इससे पहले पाइपलाइन चलाता है। एम्परसैंड बैकग्राउंड ऑपरेटर UNIX "एम्परसैंड ऑपरेटर" के समान कार्य करता है, जो पृष्ठभूमि की प्रक्रिया के रूप में प्रसिद्ध रूप से कमांड को चलाता है। एम्परसेंड पृष्ठभूमि ऑपरेटर पॉवरशेल नौकरियों के शीर्ष पर बनाया गया है, इसलिए यह बहुत अधिक कार्यक्षमता के साथ साझा करता है
Start-Job
। निम्न आदेश में एम्परसेंड पृष्ठभूमि ऑपरेटर का मूल उपयोग होता है।Get-Process -Name pwsh &
यह कार्यात्मक रूप से निम्नलिखित उपयोग के बराबर है
Start-Job
।
Start-Job -ScriptBlock {Get-Process -Name pwsh}
चूंकि यह कार्यात्मक रूप से उपयोग करने के बराबर है
Start-Job
, एम्परसेंड बैकग्राउंड ऑपरेटर किसी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 job cmdlets का उपयोग कर सकते हैं।
पॉवरशेल में 6 नौकरी से संबंधित cmdlets उपलब्ध हैं।
यदि इसके बारे में दिलचस्प है, तो आप नमूना डाउनलोड कर सकते हैं कि पावरशेल में पृष्ठभूमि नौकरी कैसे बनाएं
आप ऐसा कुछ कर सकते हैं।
$a = start-process -NoNewWindow powershell {timeout 10; 'done'} -PassThru
और अगर आप इसके लिए इंतजार करना चाहते हैं:
$a | wait-process
बोनस osx या लिनक्स संस्करण:
$a = start-process pwsh '-c',{start-sleep 5; 'done'} -PassThru
उदाहरण के लिए अदरक की स्क्रिप्ट मेरे पास है। आर्गों को एक सरणी के रूप में पारित किया जाता है:
$1 = start -n powershell pinger,comp001 -pa
start
प्रक्रिया को कांटा करेगा और कॉल करने वाले को नियंत्रण लौटाएगा। अधिक जानकारी यहाँ
tl; डॉ
Start-Process powershell { sleep 30 }
मैंने यहाँ वर्णित समाधान का उपयोग किया है http://jtruher.spaces.live.com/blog/cns !7143DA6E51A2628D !130.entry सफलतापूर्वक PowerShell v1.0 में। यह निश्चित रूप से PowerShell v2.0 में आसान होगा।
Start-Job
पीएस शेल के बाहर निकलते ही कुछ के साथ शुरू हुआ हत्या हो जाएगी। इसके विपरीत ऐसा लगता है किStart-Process
पीएस शेल के बाहर निकलने के बाद कुछ के साथ शुरू होना जारी रहेगा। यह एक बड़ा अंतर है।