बैकग्राउंड प्रोसेस को फोर्क करने / चलाने के लिए बैश एम्परसेंड (&) के पॉवर्सशेल बराबर


157

बैश में एम्परसेंड (&) का इस्तेमाल बैकग्राउंड में कमांड चलाने के लिए किया जा सकता है और कमांड के रनिंग खत्म होने से पहले यूजर को इंटरेक्टिव कंट्रोल लौटा सकता है। क्या पॉवरशेल में ऐसा करने का एक समान तरीका है?

बाश में उपयोग का उदाहरण:

 sleep 30 &

जवाबों:


123

जब तक कमांड एक निष्पादन योग्य या एक फ़ाइल है जिसमें एक संबद्ध निष्पादन योग्य है, स्टार्ट-प्रोसेस (v2 से उपलब्ध) का उपयोग करें :

Start-Process -NoNewWindow ping google.com

आप इसे अपनी प्रोफ़ाइल में एक फ़ंक्शन के रूप में भी जोड़ सकते हैं:

function bg() {Start-Process -NoNewWindow @args}

और फिर आह्वान हो जाता है:

bg ping google.com

मेरी राय में, स्टार्ट-जॉब पृष्ठभूमि में एक प्रक्रिया चलाने के सरल उपयोग के मामले में एक ओवरकिल है:

  1. स्टार्ट-जॉब की आपके मौजूदा दायरे तक पहुँच नहीं है (क्योंकि यह एक अलग सत्र में चलता है)। आप "Start-Job {notepad $ myfile}" नहीं कर सकते
  2. स्टार्ट-जॉब वर्तमान निर्देशिका को संरक्षित नहीं करता है (क्योंकि यह एक अलग सत्र में चलता है)। आप "स्टार्ट-जॉब {नोटपैड myfile.txt}" नहीं कर सकते हैं, जहां myfile.txt वर्तमान निर्देशिका में है।
  3. आउटपुट स्वचालित रूप से प्रदर्शित नहीं होता है। आपको पैरामीटर के रूप में नौकरी की आईडी के साथ प्राप्तकर्ता-नौकरी चलाने की आवश्यकता है।

नोट: अपने प्रारंभिक उदाहरण के संबंध में, "bg नींद 30" काम नहीं करेगा क्योंकि नींद एक Powershell कमांडलेट है। स्टार्ट-प्रोसेस तभी काम करता है जब आप वास्तव में एक प्रक्रिया के लिए कांटा करते हैं।


7
खुशी है कि मुझे यह जवाब मिला। मैं एक यूनिक्स कांटा-दो बार तंत्र के बराबर की तलाश में था। मेरे लिए ऐसा लगता है कि Start-Jobपीएस शेल के बाहर निकलते ही कुछ के साथ शुरू हुआ हत्या हो जाएगी। इसके विपरीत ऐसा लगता है कि Start-Processपीएस शेल के बाहर निकलने के बाद कुछ के साथ शुरू होना जारी रहेगा। यह एक बड़ा अंतर है।
पेट्र

हां - यदि आप एक स्क्रिप्ट का उपयोग शुरू करते हैं Start-Process, तो यह शेल समाप्ति से बचेगा, लेकिन यदि आपने इसे कंसोल विंडो से शुरू किया है, तो यह उस विंडो से जुड़ा रहता है और विंडो को बंद करने से प्रक्रिया समाप्त हो जाएगी।
Guss

1
ध्यान दें कि आप आउटपुट पुनर्निर्देशन नहीं कर सकते हैं Start-Processऔर इसलिए यह काम नहीं करेगा Start-Process {ping -n 1000 example.com > ping__example.com.txt }:। Start-Jobठीक काम के साथ एक ही बात (हालांकि आपको आउटपुट फ़ाइल के लिए पूर्ण पथ का उपयोग करना होगा)।
नक्स

1
नोड वेब सर्वर को चलाने के लिए ऐसा करने का प्रयास किया गया, और जब मैं पॉवरशेल से बाहर निकलता हूं तो प्रक्रिया समाप्त हो जाती है। किसी को पता है क्यों?
जेल

@Jel नहीं, लेकिन Guss की टिप्पणी उस बारे में बात करती है।
jpaugh

26

ऐसा लगता है कि स्क्रिप्ट ब्लॉक पास कर दिया गया Start-Jobहै जिसे Start-Jobकमांड के समान वर्तमान निर्देशिका के साथ निष्पादित नहीं किया गया है , इसलिए यदि आवश्यक हो तो पूरी तरह से योग्य पथ निर्दिष्ट करना सुनिश्चित करें।

उदाहरण के लिए:

Start-Job { C:\absolute\path\to\command.exe --afileparameter C:\absolute\path\to\file.txt }

3
इसलिए उदाहरण के लिए यदि मुझे कमांडलाइन में Git Pull चलाने की आवश्यकता है, तो मुझे सब कुछ करने के लिए पूर्ण पथ निर्दिष्ट करने की आवश्यकता है ...? यह वास्तव में कष्टप्रद है।
CMCDragonkai

1
धन्यवाद, महान टिप, एक नौकरी के साथ घूम रहा है जो नहीं चलेगा, यही कारण था कि।
ओमनी

@CMCDragonkai या आप केवल Start-Job {cd C: \ Path \ To \ Repo कर सकते हैं; git pull}
महोमेदिल

21
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

1
PowerShell v3.0 के अनुसार आप रियलटाइम में इस तरह से Start-Job { Write-Output 'Hello world' } | Receive-Job -Wait
आगे बढ़ सकते हैं

19

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) के साथ पाइपलाइनों की समर्थन पृष्ठभूमि

&एक पाइपलाइन के अंत में डालने से पाइपलाइन को पावरस्ले जॉब के रूप में चलाया जाता है। जब एक पाइपलाइन की पृष्ठभूमि होती है, तो एक नौकरी की वस्तु वापस आ जाती है। एक बार पाइपलाइन एक नौकरी के रूप में चल रही है, सभी मानक *-Jobcmdlets का उपयोग नौकरी का प्रबंधन करने के लिए किया जा सकता है। पाइप लाइन में उपयोग किए जाने वाले वेरिएबल्स (प्रक्रिया-विशिष्ट चर की अनदेखी) स्वचालित रूप से काम करने के लिए कॉपी किए जाते हैं इसलिए 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 देखें ।


1
इस महान सारांश के लिए धन्यवाद कि 100 एमएस के पेज पूरे नहीं हो सके।
not2qubit

किसी भी विचार कैसे कंसोल नौकरियों को संभालने के लिए ? मैंने उपरोक्त के साथ कोशिश की Receive-Job 3, लेकिन कुछ भी नहीं होता है।
नं

@ not2qubit मुझे यकीन नहीं है कि " कंसोल जॉब्स" से आपका क्या मतलब है । आप कौन सी कमांड चलाते हैं जिसे आप बैकग्राउंड में चलाना चाहते हैं?
Mariusz Pawelski

मैं एक ऐप का उपयोग कर रहा था, जो विंडोज़ कंसोल को लॉन्च करता है, लेकिन मुझे कोई आउटपुट नहीं मिल रहा है और यह उम्मीद कर रहा है कि आप इसे * फोरग्राउंड में नौकरी लाने के लिए निक्स दुनिया केfg समान ही प्राप्त करेंगे ।
23

@ not2qubit दुर्भाग्य से ऐसा लगता है कि पावरशेल fgमें यूनिक्स जैसी कोई चीज नहीं है :( मुझे इसकी तलाश है, लेकिन मुझे कुछ भी याद नहीं है
Mariusz Pawelski

17

अपने लक्ष्यों को प्राप्त करने के लिए आप PowerShell job cmdlets का उपयोग कर सकते हैं।

पॉवरशेल में 6 नौकरी से संबंधित cmdlets उपलब्ध हैं।

  • कार्य प्राप्त
    • वर्तमान सत्र में चल रहे Windows PowerShell पृष्ठभूमि कार्य हो जाते हैं
  • प्राप्त जॉब
    • वर्तमान सत्र में Windows PowerShell पृष्ठभूमि नौकरियों के परिणाम प्राप्त होते हैं
  • निकालें-नौकरी
    • एक Windows PowerShell पृष्ठभूमि कार्य हटाता है
  • स्टार्ट-नौकरी
    • एक Windows PowerShell पृष्ठभूमि कार्य प्रारंभ करता है
  • बंद करो-नौकरी
    • Windows PowerShell बैकग्राउंड जॉब रोकता है
  • प्रतीक्षा-नौकरी
    • सत्र प्रॉम्प्ट को तब तक दबाए रखता है जब तक कि सत्र में चलने वाले सभी Windows PowerShell बैकग्राउंड कार्य पूरे नहीं हो जाते

यदि इसके बारे में दिलचस्प है, तो आप नमूना डाउनलोड कर सकते हैं कि पावरशेल में पृष्ठभूमि नौकरी कैसे बनाएं


1
अच्छा जवाब क्योंकि यह पॉवर्सशेल 3+ से संबंधित है। नौकरी के cmdlets और पिछले उत्तरों के बीच क्या अंतर है?
जेरेमी हजेक

3

आप ऐसा कुछ कर सकते हैं।

$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 प्रक्रिया को कांटा करेगा और कॉल करने वाले को नियंत्रण लौटाएगा। अधिक जानकारी यहाँ
Aethalides

@Aethalides प्रारंभ वास्तव में पावरशेल में प्रारंभ-प्रक्रिया के लिए एक अन्य नाम है।
js2010


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.