ব্যাকগ্রাউন্ড প্রক্রিয়াগুলি চালনা / চলমান করার জন্য বাশ এম্পারস্যান্ডের (এবং) সমতুল্য পাওয়ারশেল


157

ব্যাশ-এ অ্যাম্পারস্যান্ড (&) পটভূমিতে একটি কমান্ড চালাতে এবং কমান্ডটি শেষ হয়ে যাওয়ার আগে ব্যবহারকারীর কাছে ইন্টারেক্টিভ নিয়ন্ত্রণ ফিরে আসতে পারে। পাওয়ারশেল এ কি করার সমতুল্য পদ্ধতি আছে?

ব্যাশে ব্যবহারের উদাহরণ:

 sleep 30 &

উত্তর:


123

যতক্ষণ না কমান্ডটি এক্সিকিউটেবল বা কোনও ফাইল যার সাথে সম্পর্কিত এক্সিকিউটেবল থাকে, স্টার্ট-প্রসেসটি ব্যবহার করুন (v2 থেকে উপলব্ধ):

Start-Process -NoNewWindow ping google.com

আপনি এটি আপনার প্রোফাইলে একটি ফাংশন হিসাবে যুক্ত করতে পারেন:

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

এবং তারপরে প্রার্থনাটি হয়ে যায়:

bg ping google.com

আমার মতে, স্টার্ট-জব ব্যাকগ্রাউন্ডে কোনও প্রক্রিয়া চালানোর সহজ ব্যবহারের ক্ষেত্রে একটি ওভারকিল:

  1. স্টার্ট-জব আপনার বিদ্যমান সুযোগে অ্যাক্সেস পাবে না (কারণ এটি একটি পৃথক অধিবেশনটিতে চলে)। আপনি "স্টার্ট-জব {নোটপ্যাড $ মাইফিল}" করতে পারবেন না
  2. স্টার্ট-জব বর্তমান ডিরেক্টরিটি সংরক্ষণ করে না (কারণ এটি একটি পৃথক অধিবেশনটিতে চালিত হয়)। বর্তমান ডিরেক্টরিতে যেখানে myfile.txt আছে আপনি "স্টার্ট-জব {notepad myfile.txt}" করতে পারবেন না।
  3. আউটপুট স্বয়ংক্রিয়ভাবে প্রদর্শিত হয় না। প্যারামিটার হিসাবে আপনাকে কাজের আইডি দিয়ে রিসিভ-জব চালাতে হবে।

দ্রষ্টব্য: আপনার প্রাথমিক উদাহরণ সম্পর্কে, "বিজি স্লিপ 30" কাজ করবে না কারণ ঘুম একটি পাওয়ারশেল কমান্ডলেট। শুরু-প্রক্রিয়া কেবল তখনই কাজ করে যখন আপনি প্রকৃতপক্ষে কোনও প্রক্রিয়াটি কাঁটাচামচ করেন।


7
খুশী আমি এই উত্তরটি পেয়েছি। আমি ইউনিক্স কাঁটাচামচ-দ্বিগুণ প্রক্রিয়াটির সমতুল্য সন্ধান করছিলাম। আমার কাছে মনে হচ্ছে Start-Jobপিএস শেলটি যখন প্রস্থান করা হবে তখন দিয়ে শুরু করা কিছু মারা যাবে। বিপরীতে এটি দেখে মনে হয় যে Start-Processপিএস শেলটি প্রস্থান করার পরে দিয়ে শুরু করা কিছু চলতে থাকবে। এটি একটি প্রধান পার্থক্য।
পিটারহ

হ্যাঁ - আপনি যদি স্ক্রিপ্টটি ব্যবহার করে Start-Processশুরু করেন তবে এটি শেল সমাপ্তি টিকে থাকবে, তবে আপনি যদি এটি কনসোল উইন্ডো থেকে শুরু করেন তবে এটি সেই উইন্ডোর সাথে আবদ্ধ থাকে এবং উইন্ডোটি বন্ধ করে দেওয়ার প্রক্রিয়াটি সমাপ্ত হবে।
গাস

1
নোট তবে যে আপনার সাথে আউটপুট ফেরৎ ব্যবহার করতে পারবেন না Start-Processএবং তাই এই করা হবে না কাজ: Start-Process {ping -n 1000 example.com > ping__example.com.txt }Start-Jobঠিক কাজ করে একই জিনিস (যদিও আপনাকে আউটপুট ফাইলের পুরো পথ ব্যবহার করতে হবে)।
নাক্স

1
নোড ওয়েব সার্ভারটি চালানোর জন্য এটি করার চেষ্টা করা হয়েছিল এবং আমি পাওয়ারশেল থেকে প্রস্থান করার পরে প্রক্রিয়াটি শেষ হয়। কেউ জানেন কেন?
জেল

@ জেল নো, তবে গুসের মন্তব্য সে সম্পর্কে আলোচনা করে।
jpaugh

26

দেখে মনে হচ্ছে যে স্ক্রিপ্ট ব্লকটি পাস হয়েছে Start-Jobসেই একই বর্তমান ডিরেক্টরিটি Start-Jobকমান্ডের সাথে চালিত হয়নি , সুতরাং প্রয়োজনে সম্পূর্ণ যোগ্যতার পথ নির্দিষ্ট করতে ভুলবেন না।

উদাহরণ স্বরূপ:

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

3
সুতরাং উদাহরণস্বরূপ, যদি আমাকে কমান্ডলাইনে গিট পুল চালানো দরকার, আমাকে সমস্ত কিছুর পুরো পথ নির্দিষ্ট করতে হবে ...? এটা সত্যিই বিরক্তিকর।
সিএমসিডিগ্রাগনকাই

1
ধন্যবাদ, দুর্দান্ত টিপ, এমন একটি চাকরি নিয়ে ঘুরে যাচ্ছিল যা দৌড়াবে না, এই কারণ ছিল।
ওমনি

@ সিএমসিডিগ্রাগনকাই বা আপনি কেবল স্টার্ট-জব {সিডি সি: \ পাথ \ টু \ রেপো করতে পারেন; গিট টান}
মাহমোদ্দিনে

21
ps2> start-job {start-sleep 20}

রিয়েলটাইমে স্টাডআউট কীভাবে পাবেন তা আমি এখনও বুঝতে পারি নি, স্টার্ট-জব আপনাকে গেট-জব দিয়ে স্টডআউট পোল করতে হবে

আপডেট: আমি প্রাথমিকভাবে ব্যাশ এবং অপারেটর যা চাই তা করতে খুব সহজেই আমি আরম্ভ করতে পারি না। এখানে এখন পর্যন্ত আমার সেরা হ্যাক

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
পাওয়ারশেল v3.0 হিসাবে আপনি রিয়েলটাইমে এই জাতীয় Start-Job { Write-Output 'Hello world' } | Receive-Job -Wait
স্টাডাউট

19

পাওয়ারশেল কোর 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 ..; } &

ডকুমেন্টেশন পৃষ্ঠাগুলি থেকে এখানে আরও কিছু তথ্য দেওয়া হয়েছে:

পাওয়ারশেল কোর 6.0 এ নতুন কী থেকে :

এম্পারস্যান্ড (এবং) (# 3360) দিয়ে পাইপলাইনগুলির ব্যাকগ্রাউন্ডিং সমর্থন করুন

ফেলে &একটি পাইপলাইন শেষে ঘটায় পাইপলাইন একটি PowerShell কাজ হিসাবে চালানো হবে। যখন একটি পাইপলাইন ব্যাকগ্রাউন্ড হয়, একটি কাজের বস্তু ফিরে আসে। পাইপলাইনটি একবার চাকরি হিসাবে চলতে থাকলে, মানসম্পন্ন সমস্ত *-Jobসেমিডলেটগুলি কাজটি পরিচালনা করতে ব্যবহার করা যেতে পারে। পাইপলাইনে ব্যবহৃত চলকগুলি (প্রক্রিয়া-নির্দিষ্ট ভেরিয়েবলগুলি উপেক্ষা করে) স্বয়ংক্রিয়ভাবে চাকরিতে অনুলিপি করা হয় তাই Copy-Item $foo $bar &ঠিক কাজ করে works কাজটি ব্যবহারকারীর হোম ডিরেক্টরি পরিবর্তে বর্তমান ডিরেক্টরিতে চালানো হয়। পাওয়ারশেল কাজ সম্পর্কে আরও তথ্যের জন্য, দেখুন_জবস

থেকে about_operators / ভাবিস পটভূমি অপারেটর & :

এম্পারস্যান্ড ব্যাকগ্রাউন্ড অপারেটর এবং

পাওয়ারশেল কাজের আগে পাইপলাইন চালায়। এম্পারস্যান্ড ব্যাকগ্রাউন্ড অপারেটরটি ইউনিক্স "অ্যাম্পারস্যান্ড অপারেটর" এর সাথে একইভাবে কাজ করে যা পটভূমি প্রক্রিয়া হিসাবে এটির আগে কমান্ডটি বিখ্যাতভাবে চালায় runs এম্পারস্যান্ড ব্যাকগ্রাউন্ড অপারেটরটি পাওয়ারশেলের কাজের উপরে নির্মিত যাতে এটি এর সাথে প্রচুর কার্যকারিতা ভাগ করে নেয় 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ঠিক যেমন আপনি যদি ব্যবহার করেছিল would 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

পাওয়ারশেল কাজের বিষয়ে আরও তথ্যের জন্য, দেখুন_জবস


1
এই দুর্দান্ত সংক্ষিপ্তসার জন্য ধন্যবাদ যে এমএস এর 100 টি পৃষ্ঠা সম্পাদন করতে পারেনি Thanks
not2qubit

কোন ধারণা কীভাবে কনসোল কাজগুলি পরিচালনা করবেন ? আমি উপরোক্ত সাথে চেষ্টা করেছিলাম Receive-Job 3, কিন্তু কিছুই হয় না।
not2qubit

@ not2qubit " কনসোল জবস" বলতে আপনার অর্থ কী তা আমি নিশ্চিত নই । আপনি কোন কমান্ডটি চালাচ্ছেন যা আপনি পটভূমিতে চালাতে চান?
মারিউজ পাভেলস্কি

আমি একটি অ্যাপ্লিকেশন ব্যবহার করছিলাম যা একটি উইন্ডোজ কনসোল চালু করে, তবে আমি কোনও আউটপুট পেতে পারি না এবং * পূর্বভূমিতে কাজ আনার জন্য এটি নিক্স ওয়ার্ল্ডের সাথেfg একইভাবে পাওয়ার আশা করছিলাম ।
not2qubit

@ not2qubit দুর্ভাগ্যক্রমে মনে হচ্ছে পাওয়ারেক্সেলে ইউনিক্সের মতো আর কিছুই নেই fg:( মনে আছে এটি খুঁজছিলাম, কিন্তু কিছুই খুঁজে পেলাম না
মারিউজ পাভেলস্কি

17

আপনার লক্ষ্য অর্জনের জন্য আপনি পাওয়ারশেল জব সেন্টিমিডলেট ব্যবহার করতে পারেন।

পাওয়ারশেলে 6 টি জব সম্পর্কিত সেমিডলেট পাওয়া যায়।

  • কাজ পাও
    • বর্তমান অধিবেশনটিতে চলমান উইন্ডোজ পাওয়ারশেল পটভূমি কাজগুলি পান
  • জখন-ইয়োব
    • বর্তমান অধিবেশনে উইন্ডোজ পাওয়ারশেলের পটভূমির কাজের ফলাফল পান
  • সরান-ইয়োব
    • একটি উইন্ডোজ পাওয়ারশেল পটভূমি কাজ মুছে ফেলে
  • স্টার্ট-ইয়োব
    • একটি উইন্ডোজ পাওয়ারশেল পটভূমি কাজ শুরু করে
  • স্টপ-ইয়োব
    • একটি উইন্ডোজ পাওয়ারশেল ব্যাকগ্রাউন্ড কাজ বন্ধ করে
  • অপেক্ষা করুন-ইয়োব
    • সেশনে চলমান উইন্ডোজ পাওয়ারশেলের পটভূমির কাজগুলির এক বা সমস্ত সম্পূর্ণ না হওয়া পর্যন্ত কমান্ড প্রম্পটকে দমন করে

যদি এটি সম্পর্কে আকর্ষণীয় হয় তবে আপনি পাওয়ারশেলে পটভূমি কাজ কীভাবে তৈরি করবেন তা নমুনাটি ডাউনলোড করতে পারেন


1
পাওয়ার উত্তর 3+ এর সাথে সম্পর্কিত হিসাবে ভাল উত্তর। কাজের সিএমডিলেট এবং আগের উত্তরগুলির মধ্যে পার্থক্য কী?
জেরেমি হাজেক

3

আপনি এরকম কিছু করতে পারেন।

$a = start-process -NoNewWindow powershell {timeout 10; 'done'} -PassThru

এবং আপনি যদি এটির জন্য অপেক্ষা করতে চান:

$a | wait-process

বোনাস অসক্স বা লিনাক্স সংস্করণ:

$a = start-process pwsh '-c',{start-sleep 5; 'done'} -PassThru 

উদাহরণস্বরূপ পিংর স্ক্রিপ্ট আমার আছে। আরোগুলি একটি অ্যারে হিসাবে পাস করা হয়েছে:

$1 = start -n powershell pinger,comp001 -pa

start প্রক্রিয়া কাঁটাচামচা করবে এবং কলারের কাছে নিয়ন্ত্রণ ফিরিয়ে দেবে। এখানে
অ্যাথালাইডস

@ অ্যাথালাইডস স্টার্টটি আসলে পাওয়ারশেলের প্রারম্ভিক প্রক্রিয়ার জন্য একটি উপনাম।
js2010


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.