ব্যাশ-এ অ্যাম্পারস্যান্ড (&) পটভূমিতে একটি কমান্ড চালাতে এবং কমান্ডটি শেষ হয়ে যাওয়ার আগে ব্যবহারকারীর কাছে ইন্টারেক্টিভ নিয়ন্ত্রণ ফিরে আসতে পারে। পাওয়ারশেল এ কি করার সমতুল্য পদ্ধতি আছে?
ব্যাশে ব্যবহারের উদাহরণ:
sleep 30 &
ব্যাশ-এ অ্যাম্পারস্যান্ড (&) পটভূমিতে একটি কমান্ড চালাতে এবং কমান্ডটি শেষ হয়ে যাওয়ার আগে ব্যবহারকারীর কাছে ইন্টারেক্টিভ নিয়ন্ত্রণ ফিরে আসতে পারে। পাওয়ারশেল এ কি করার সমতুল্য পদ্ধতি আছে?
ব্যাশে ব্যবহারের উদাহরণ:
sleep 30 &
উত্তর:
যতক্ষণ না কমান্ডটি এক্সিকিউটেবল বা কোনও ফাইল যার সাথে সম্পর্কিত এক্সিকিউটেবল থাকে, স্টার্ট-প্রসেসটি ব্যবহার করুন (v2 থেকে উপলব্ধ):
Start-Process -NoNewWindow ping google.com
আপনি এটি আপনার প্রোফাইলে একটি ফাংশন হিসাবে যুক্ত করতে পারেন:
function bg() {Start-Process -NoNewWindow @args}
এবং তারপরে প্রার্থনাটি হয়ে যায়:
bg ping google.com
আমার মতে, স্টার্ট-জব ব্যাকগ্রাউন্ডে কোনও প্রক্রিয়া চালানোর সহজ ব্যবহারের ক্ষেত্রে একটি ওভারকিল:
দ্রষ্টব্য: আপনার প্রাথমিক উদাহরণ সম্পর্কে, "বিজি স্লিপ 30" কাজ করবে না কারণ ঘুম একটি পাওয়ারশেল কমান্ডলেট। শুরু-প্রক্রিয়া কেবল তখনই কাজ করে যখন আপনি প্রকৃতপক্ষে কোনও প্রক্রিয়াটি কাঁটাচামচ করেন।
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}
রিয়েলটাইমে স্টাডআউট কীভাবে পাবেন তা আমি এখনও বুঝতে পারি নি, স্টার্ট-জব আপনাকে গেট-জব দিয়ে স্টডআউট পোল করতে হবে
আপডেট: আমি প্রাথমিকভাবে ব্যাশ এবং অপারেটর যা চাই তা করতে খুব সহজেই আমি আরম্ভ করতে পারি না। এখানে এখন পর্যন্ত আমার সেরা হ্যাক
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
পাওয়ারশেল কোর 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
ঠিক যেমন আপনি যদি ব্যবহার করেছিল wouldStart-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
পাওয়ারশেল কাজের বিষয়ে আরও তথ্যের জন্য, দেখুন_জবস ।
Receive-Job 3
, কিন্তু কিছুই হয় না।
fg
একইভাবে পাওয়ার আশা করছিলাম ।
fg
:( মনে আছে এটি খুঁজছিলাম, কিন্তু কিছুই খুঁজে পেলাম না
আপনার লক্ষ্য অর্জনের জন্য আপনি পাওয়ারশেল জব সেন্টিমিডলেট ব্যবহার করতে পারেন।
পাওয়ারশেলে 6 টি জব সম্পর্কিত সেমিডলেট পাওয়া যায়।
যদি এটি সম্পর্কে আকর্ষণীয় হয় তবে আপনি পাওয়ারশেলে পটভূমি কাজ কীভাবে তৈরি করবেন তা নমুনাটি ডাউনলোড করতে পারেন
আপনি এরকম কিছু করতে পারেন।
$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
প্রক্রিয়া কাঁটাচামচা করবে এবং কলারের কাছে নিয়ন্ত্রণ ফিরিয়ে দেবে। এখানে
TL; ড
Start-Process powershell { sleep 30 }
আমি এখানে বর্ণিত সমাধানটি http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry সাফল্যের সাথে PowerSll v1.0 এ ব্যবহার করেছি । পাওয়ারশেল v2.0 এ এটি অবশ্যই সহজতর হবে।
Start-Job
পিএস শেলটি যখন প্রস্থান করা হবে তখন দিয়ে শুরু করা কিছু মারা যাবে। বিপরীতে এটি দেখে মনে হয় যেStart-Process
পিএস শেলটি প্রস্থান করার পরে দিয়ে শুরু করা কিছু চলতে থাকবে। এটি একটি প্রধান পার্থক্য।