পাওয়ারশেলের একটি স্ক্রিপ্ট সমাপ্তি


394

যখন কোনও ফাংশনের মধ্যে অপরিবর্তনযোগ্য ত্রুটি ঘটে তখন আমি পাওয়ারশেল (পিএস 1) স্ক্রিপ্টটি শেষ করার জন্য একটি উপায় খুঁজছিলাম। উদাহরণ স্বরূপ:

function foo() {
    # Do stuff that causes an error
    $host.Exit()
}

অবশ্যই এর মতো কোনও জিনিস নেই $host.Exit()। আছে $host.SetShouldExit(), কিন্তু এটি আসলে কনসোল উইন্ডোটি বন্ধ করে দেয়, যা আমি চাই না। আমার যা দরকার তা পাইথনের সমতুল্য কিছু sys.exit()যা কেবলমাত্র অ্যাডিয়ু ছাড়াই বর্তমান স্ক্রিপ্টটির সম্পাদন বন্ধ করে দেয়।

সম্পাদনা: হ্যাঁ, এটি ঠিক exit। Duh।


8
আপনি যদি আমার ক্ষেত্রে পাওয়ারশেল উইন্ডো বা আইএসই বন্ধ করা এড়াতে চান; পরিবর্তে "রিটার্ন" ব্যবহার করুন। এটি কেবল বর্তমান চলমান প্রসঙ্গটি শেষ করে। "নতুন লোক" শিক্ষামূলক উদ্দেশ্যে সমস্ত বিকল্পের পুরোপুরি ব্যাখ্যা করে; আপনি ভবিষ্যতের স্ট্যাকওভারফ্লো ব্যবহারকারীদের জন্য আপনার গৃহীত উত্তর (বর্তমানে যেভাবেই হোক আরও বেশি ভোট রয়েছে) পরিবর্তন করতে বিবেচনা করতে পারেন। এটি আপনাকে স্ক্রিপ্টটিও ডিবাগ করার অনুমতি দেবে।
জ্যাক্সলফুল

এটা কি তোমার প্রশ্নের উত্তর? পাওয়ারশেলের "প্রস্থান" ঠিক কী?
মার্ক শুলথিস

উত্তর:


389

আপনার exitকীওয়ার্ডটি ব্যবহার করা উচিত ।


15
পবিত্র বাজে কথা, আমি যদি এই জিনিসগুলি চতুরতার সাথে কীভাবে করব তা অনুধাবন করার চেষ্টা করতে না পারলে আমি সম্ভবত চেষ্টা করেছি এটির সাথে শুরু করার এবং এটি কার্যকরভাবে আবিষ্কার করার জন্য :) ধন্যবাদ!
kprobst

118
এটি কীভাবে গৃহীত উত্তর? এটি বিশেষত "কনসোল উইন্ডোটি বন্ধ করে দেয়" যা প্রশ্নকর্তা বলেছিলেন "যা আমি চাই তা নয়।"
ক্লডেকেনিলিল

3
@ ক্লাউডেকেন্নিলল কেবল প্রশ্নকারীই উত্তর গ্রহণ করতে পারবেন। হয় তারা এ ঘটনাটি মিস করেছেন যে প্রস্থানটি উইন্ডোটি বন্ধ করার কথা, বা তারা তাদের মত বদলেছে এবং তাদের উদ্দেশ্যটিকে এটি গ্রহণযোগ্য বলে মনে করেছে।
ইসজি

3
এটি v3 বা v4 এ কনসোল উইন্ডোটি বন্ধ করে না, যা আমি ব্যবহার করি। ঠিক আছে, আপনি যদি এক্সপ্লোরার থেকে স্ক্রিপ্টটি চালান তবে এটি আপনি কীভাবে স্ক্রিপ্টটি শেষ করবেন তা বিবেচনাধীন নয়। পাওয়ারশেল কমান্ড উইন্ডো থেকে চলতে থাকলে এটি উইন্ডোটি বন্ধ করে না।
জোশুয়া নুরজাইক 20'15

14
নিউ গাইয়ের উত্তরটি আরও পুঙ্খানুপুঙ্খভাবে রয়েছে এবং প্রেরিতরা স্বীকৃত হিসাবে চিহ্নিত হয়েছে।
জিম আহো

585

আমি বুঝতে পারি এটি একটি পুরানো পোস্ট তবে আমি নিজেকে এই থ্রেডে অনেকটা ফিরে আসতে দেখি কারণ এই বিষয়টির অনুসন্ধানের সময় এটি শীর্ষস্থানীয় অনুসন্ধান ফলাফলগুলির মধ্যে একটি। যাইহোক, আমি বিতর্কিত তথ্যের কারণে যখন এসেছিলাম তখন আমি সবসময় আরও বিভ্রান্ত হয়ে পড়ে থাকি। শেষ পর্যন্ত আমাকে এটি বের করার জন্য সর্বদা আমার নিজের পরীক্ষা চালিয়ে যেতে হয়। তাই এবার আমি আমার অনুসন্ধানগুলি পোস্ট করব।

টিএল; ডিআর বেশিরভাগ লোকেরা Exitচলমান স্ক্রিপ্টগুলি বন্ধ করতে ব্যবহার করতে চাইবে । তবে, যদি আপনার স্ক্রিপ্টটি কেবল শেল ব্যবহারের জন্য ফাংশনগুলি ঘোষনা করে তবে আপনি Returnউল্লিখিত ফাংশনগুলির সংজ্ঞাটিতে ব্যবহার করতে চাইবেন ।

রিটার্ন বনাম ব্রেক প্রস্থান করুন

  • প্রস্থান: এটি বর্তমানে চলমান প্রসঙ্গে "প্রস্থান" করবে। আপনি যদি কোনও স্ক্রিপ্ট থেকে এই আদেশটি কল করেন তবে এটি স্ক্রিপ্ট থেকে প্রস্থান করবে। আপনি যদি শেল থেকে এই আদেশটি কল করেন তবে এটি শেলটি থেকে প্রস্থান করবে।

    যদি কোনও ফাংশন প্রস্থান কমান্ডকে কল করে তবে এটি যে প্রসঙ্গে চলছে তা প্রস্থান করবে। সুতরাং যদি সেই ফাংশনটি কেবল একটি চলমান স্ক্রিপ্টের মধ্যে থেকে ডাকা হয় তবে এটি সেই স্ক্রিপ্ট থেকে প্রস্থান করবে। তবে, যদি আপনার স্ক্রিপ্টটি কেবলমাত্র ফাংশনটি ঘোষণা করে যাতে এটি বর্তমান শেল থেকে ব্যবহার করা যায় এবং আপনি শেলটি থেকে সেই ফাংশনটি চালান, এটি শেলটি থেকে প্রস্থান করবে কারণ শেলটি সেই প্রসঙ্গে যেখানে Exitকমান্ড অনুমানকারী ফাংশনটি চলছে is

    দ্রষ্টব্য: ডিফল্টরূপে আপনি যদি স্ক্রিপ্টটি চালনার জন্য কোনও স্ক্রিপ্টে ডান ক্লিক করেন, একবার স্ক্রিপ্টটি সঞ্চালিত হয়ে যায়, পাওয়ারশেল স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে। Exitকমান্ড বা আপনার স্ক্রিপ্টের অন্য কোনও কিছুর সাথে এর কোনও যোগসূত্র নেই। স্ক্রিপ্টগুলি চালনার এই নির্দিষ্ট পদ্ধতিটি ব্যবহার করে স্ক্রিপ্টগুলির জন্য এটি কেবলমাত্র একটি ডিফল্ট পাওয়ারশেল আচরণ। একই ব্যাচ ফাইল এবং কমান্ড লাইন উইন্ডো ক্ষেত্রে সত্য।

  • রিটার্ন: এটি আগের কল পয়েন্টে ফিরে আসবে। আপনি যদি কোনও স্ক্রিপ্ট থেকে এই আদেশটি কল করেন (কোনও ফাংশনের বাইরে) এটি শেলের কাছে ফিরে আসবে। আপনি যদি শেল থেকে এই আদেশটি কল করেন তবে এটি শেলের কাছে ফিরে আসবে (এটি শেল থেকে চালিত একক কমান্ডের জন্য পূর্ববর্তী কল পয়েন্ট)। আপনি যদি কোনও ফাংশন থেকে এই আদেশটি কল করেন তবে এটি যেখানে ফাংশনটি ডেকে আনা হয়েছিল সেখানে ফিরে আসবে।

    কল পয়েন্টে যে কোনও কমান্ড কার্যকর করা হয়েছে যা এটি ফিরে আসে সেই বিন্দু থেকে অব্যাহত থাকবে। যদি কোনও স্ক্রিপ্ট শেল থেকে ডাকা হয় এবং এতে Returnকোনও ফাংশনের বাইরে কমান্ড থাকে তবে শেলটিতে ফিরে এলে এটি চালানোর আর কোনও কমান্ড থাকে না Returnযা মূলত একইভাবে ব্যবহৃত হয় Exit

  • বিরতি: এটি লুপগুলি স্যুইচ করবে এবং কেসগুলি স্যুইচ করবে। আপনি যদি লুপ বা সুইচ কেস না করে এই কমান্ডটি কল করেন তবে এটি স্ক্রিপ্টের বাইরে চলে যাবে। যদি আপনি Breakকোনও লুপটির ভিতরে কল করেন যা একটি লুপের ভিতরে বাসা বাঁধে তবে এটি কেবল যে লুপটি বলা হয়েছিল তার মধ্যেই এটি ভেঙে যাবে।

    এখানে একটি আকর্ষণীয় বৈশিষ্ট্য রয়েছে Breakযেখানে আপনি একটি লেবেল সহ একটি লুপ উপসর্গ করতে পারেন এবং তারপরে সেই লেবেলযুক্ত লুপের Breakমধ্যে বেশ কয়েকটি নেস্টেড গ্রুপের মধ্যে কমান্ডটি কল করা সত্ত্বেও আপনি সেই লেবেলযুক্ত লুপটি ভেঙে ফেলতে পারেন ।

    While ($true) {
        # Code here will run
    
        :myLabel While ($true) {
            # Code here will run
    
            While ($true) {
                # Code here will run
    
                While ($true) {
                    # Code here will run
                    Break myLabel
                    # Code here will not run
                }
    
                # Code here will not run
            }
    
            # Code here will not run
        }
    
        # Code here will run
    }
    

39
এছাড়াও লক্ষণীয় যে Exitপ্যারামিটার হিসাবে একটি রিটার্ন কোড নিতে পারে (0 এ ডিফল্ট) - যেমন Exit 3
aucuparia

2
আমি সম্মত, এটি একটি আরও ভাল উত্তর। "বিরতি" এর অনিচ্ছাকৃত পরিণতি হতে পারে।
iagomartinez

আমি নিশ্চিত না যে "প্রস্থান" সম্পর্কে আপনার মন্তব্য সম্পূর্ণরূপে সঠিক যদিও এটি সামগ্রিকভাবে দুর্দান্ত উত্তর answer প্রস্থানটি ISE কে এমনভাবে বন্ধ করে দিচ্ছে যা অন্য কিছু করছে না বলে মনে হচ্ছে। কেবল প্রসঙ্গে প্রস্থান করা (উদাহরণস্বরূপ, স্ক্রিপ্ট সমাপ্তি) এটি করে না।
বিল কে

1
@ বিলক প্রকৃতপক্ষে। আমি উত্তর আপডেট করেছি। আমি যখন এটি প্রথম লিখেছিলাম আমার মনে আছে প্রস্থানটিতে কোনও অফিসিয়াল ডকুমেন্টেশন খুঁজে পাওয়া যায় না। আমি তখন একটি করেছি Get-Command Exitএবং Get-Alias Exitকোনও ফলাফল ছাড়াই। আমি তখন এটি কীওয়ার্ড কিনা তা দেখতে চেয়েছি এবং এটিতে কোনও অফিসিয়াল ডকুমেন্টেশন পাইনি। যদিও এখন এটি তাকান, আমি জানি না যে আমি কীভাবে এই সিদ্ধান্তে পৌঁছেছি। স্পষ্টত এটি একটি কীওয়ার্ড ( টেকনেট.মাইক্রোসফট.ইন- ইউস / লিবারি /hh847744.aspx )। সম্ভবত কারণ প্রস্থানটি হ'ল একমাত্র কীওয়ার্ড যার নিজস্ব_ সহায়তার বিষয় নেই এবং তাই বাম সাইডবারের বিষয়গুলির তালিকায় এটি অন্তর্ভুক্ত হয়নি।
নিউ গাই

6
নিক্ষেপ কি?
জেডিসি

80

Exitপাওয়ারশেল থেকেও প্রস্থান করবেন। আপনি যদি কেবলমাত্র বর্তমান ফাংশন বা স্ক্রিপ্ট থেকে "ব্রেক" করতে চান - ব্যবহার করুন Break:)

If ($Breakout -eq $true)
{
     Write-Host "Break Out!"
     Break
}
ElseIf ($Breakout -eq $false)
{
     Write-Host "No Breakout for you!"
}
Else
{
    Write-Host "Breakout wasn't defined..."
}

5
breakকেবলমাত্র বর্তমান ফাংশনটি ভেঙে ফেলতে চাইলে দয়া করে ব্যবহার করবেন না ... কলিং স্ক্রিপ্টগুলিও ব্যাহত হতে পারে!
ড্যানিমিস্টার

49

লিখন-ত্রুটিটি নন-টার্মিনেট ত্রুটিগুলির জন্য এবং নিক্ষেপ ত্রুটিগুলি সমাপ্তির জন্য

লিখন-ত্রুটি cmdlet একটি অবসানহীন ত্রুটি ঘোষণা করে। ডিফল্টরূপে, ত্রুটিগুলি ত্রুটি প্রবাহে আউটপুট সহ প্রদর্শিত হোস্ট প্রোগ্রামে প্রেরণ করা হয়।

অবিরত না হওয়া ত্রুটি ত্রুটি প্রবাহে একটি ত্রুটি লিখলেও তারা কমান্ড প্রক্রিয়াজাতকরণ বন্ধ করে না। যদি ইনপুট আইটেমগুলির সংকলনে কোনও আইটেমটিতে অবসন্ন না হওয়া ত্রুটি ঘোষণা করা হয়, কমান্ডটি সংগ্রহের অন্যান্য আইটেমগুলিতে প্রক্রিয়া চালিয়ে যেতে পারে।

একটি সমাপ্তি ত্রুটি ঘোষণা করতে, থ্রো কীওয়ার্ডটি ব্যবহার করুন। আরও তথ্যের জন্য, দেখুন_থ্রো ( http://go.microsoft.com/fwlink/?LinkID=145153 )।


4
এটি ত্রুটিযুক্ত ক্রিয়াকলাপ বন্ধ করার সবচেয়ে সঠিক উপায় বলে মনে হচ্ছে। এটি ফোনকারীকে ত্রুটিটি পরিচালনা করার চেষ্টা করার জন্য প্রেরণ করে, যা হঠাৎ করেই বন্ধ করার চেষ্টা করার চেয়ে অনেক ভাল।
পল টার্নার

আমার জন্য, কমপক্ষে মডিউল ফাংশনে, প্রস্থানগুলি নিক্ষেপ করুন তবে একটি প্রস্থান কোড সেট করে না। এটি সিএলআই উদাহরণস্বরূপ কার্যকর করা হয়েছিল powershell -command "& module-function ..."। আমাকে একটি র‌্যাপিং ট্রাই-ক্যাচে ফেলে দেওয়ার জন্য সেই ফাংশনগুলিকে রূপান্তর করতে হবে এবং প্রকৃতপক্ষে একটি ত্রুটির প্রস্থান কোড আউটপুট করার জন্য সেই মোড়ানো ক্যাচ থেকে প্রস্থান করতে হবে।
জোশ

2
ভুলবেন না $PSCmdlet.ThrowTerminatingError()যখন নিক্ষেপ শুধু কাজ (থেকে জানা ইস্যু কেউ সসীম ত্রুটিযুক্ত সম্পন্ন না পেতে পারেন সেই দৃষ্টান্ত জন্য throw)
Djarid

33

এই প্রক্রিয়াটি শেষ করে এবং অন্তর্নিহিত অপারেটিং সিস্টেমটিকে নির্দিষ্ট প্রস্থান কোড দেয়।

https://msdn.microsoft.com/en-us/library/system.environment.exit%28v=vs.110%29.aspx

[Environment]::Exit(1)

এটি আপনাকে একটি নির্দিষ্ট প্রস্থান কোডের সাথে প্রস্থান করতে দেয়, যা কলার থেকে নেওয়া যেতে পারে।


3
পাওয়ারশেলে, আপনি এটির জন্য বিল্ট-ইন প্রস্থানটি সহজেই ব্যবহার করতে পারেন, যেমন Exit 1
জোনাস

3
অন্তর্নির্মিত প্রস্থান সর্বদা আপনার প্রত্যাশার মতো কাজ করবে না। PowerShell এই করে দেখুন: "থেকে প্রস্থান করুন 5"> test1.ps1 powershell.exe \ test1.ps1 $ lastexitcode "[পরিবেশ] :: থেকে প্রস্থান করুন (5)"> test2.ps1 powershell.exe \ test2.ps1 $
gabriwinter

1
[Environment]::Exit(1)আমার পাওয়ারশেল উইন্ডোটি প্রস্থান করার পার্শ্ব প্রতিক্রিয়া রয়েছে যখন আমি এটি কোনও স্ক্রিপ্টে প্রার্থনা করি, যেখানে ব্যবহারটি তেমনভাবে exitপ্রদর্শিত হয় না।
জোশ ডেসমন্ড

25

আমি মনে করি আপনি Returnপরিবর্তে খুঁজছেন Break। বিরতি সাধারণত লুপগুলির জন্য ব্যবহৃত হয় এবং কেবলমাত্র অন্তঃতম কোড ব্লক থেকে বিরতি। কোনও ফাংশন বা স্ক্রিপ্ট থেকে বেরিয়ে আসার জন্য রিটার্ন ব্যবহার করুন।


7
এটা সঠিক নয় - ওপি বিশেষভাবে একটি স্ক্রিপ্ট থেকে প্রস্থান জন্য অনুরোধ একটি ফাংশন মধ্যে থেকেReturnস্ক্রিপ্ট থেকে নয়, কেবল ফাংশন থেকে ফিরে আসবে। ( Returnশীর্ষ একটি স্ক্রিপ্ট মাত্রা স্ক্রিপ্ট বন্ধ করে দেব, কিন্তু যে প্রশ্ন ছিল না।)
মাইকেল Sorens

1
এই 'উত্তর' আসলে EverydayNerd উত্তর মন্তব্য?
tkokasih

22

একটি ব্যতিক্রম নিক্ষেপ করা ভাল হবে বিশেষত যদি আপনি ত্রুটির কারণটি স্পষ্ট করতে চান:

throw "Error Message"

এটি একটি সমাপ্তি ত্রুটি উত্পন্ন করবে।


3
আমি মনে করি না এটি প্রায় এক বছর আগের স্ট্যাকওভারফ্লো.com
জেসন এস

12

"ফাঁদ" ব্যবহার করা আরও ভাল May একটি পাওয়ারশেল ট্র্যাপ যখন একটি সমাপ্তি বা ত্রুটি ঘটে তখন চালানোর জন্য একটি কোডব্লক নির্দিষ্ট করে। আদর্শ

Get-Help about_trap

ফাঁদ বিবৃতি সম্পর্কে আরও জানতে।


10

আমি কাকতালীয়ভাবে খুঁজে পেয়েছি যে (যেমন সহজভাবে , যেখানে লেবেল উপস্থিত নেই ) পুরো স্ক্রিপ্টটি বেরিয়ে আসে (এমনকি কোনও ফাংশনের মধ্যে থেকেও) এবং হোস্টকে বাঁচিয়ে রাখে। এইভাবে আপনি এমন একটি ক্রিয়াকলাপ তৈরি করতে পারেন যা বর্তমান স্কোপটি (এবং লেবেল তৈরি না করে) যে কোনও জায়গা থেকে স্ক্রিপ্টটি ভেঙে দেয় (যেমন একটি পুনরাবৃত্ত লুপ):Break <UnknownLabel>Break ScriptScript

Function Quit($Text) {
    Write-Host "Quiting because: " $Text
    Break Script
} 

1
আপনার উত্তর সত্য, কিন্তু সচেতন এই আপনার স্ক্রিপ্টের কলারের জন্য সমস্যা সৃষ্টি করতে পারে যদি তারা সমগ্র স্ক্রিপ্ট থেকে প্রস্থান করার জন্য আপনার ইচ্ছা সঙ্গে মতানৈক্য হতে: stackoverflow.com/questions/45746588/...
DannyMeister

5

আমি এটি একটি প্রোগ্রাম পুনরায় চালু করার জন্য ব্যবহার করেছি। আমি জানি না এটি সাহায্য করবে কিনা, তবে এটি কেবল সহজ যদি বিবৃতিতে কেবল দুটি পৃথক প্রবেশের প্রয়োজন হয়। এটি আমার জন্য পাওয়ারশেলে কাজ করেছিল।

$rerun = Read-Host "Rerun report (y/n)?"

if($rerun -eq "y") { Show-MemoryReport }
if($rerun -eq "n") { Exit }

এটি সাহায্য করে কিনা জানি না তবে আমি বিশ্বাস করি এটি কোনও প্রোগ্রাম চালানোর পরে এটি বন্ধ করার ধরণীর সাথে থাকবে। তবে এই ক্ষেত্রে, প্রতিটি সংজ্ঞায়িত ইনপুটের জন্য একটি তালিকাবদ্ধ এবং শ্রেণিবদ্ধ আউটপুট প্রয়োজন। আপনি প্রস্থান থেকে একটি নতুন প্রম্পট লাইন কল করতে পারেন এবং প্রোগ্রামটি সেভাবে শেষ করতে পারেন।

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