পাওয়ারশেল: স্ক্রিপ্টে প্রদর্শিত হওয়া থেকে আমি কীভাবে ত্রুটিগুলি থামাতে পারি?


94

যখন আমার পাওয়ারশেল স্ক্রিপ্টটি চেষ্টা করে, উদাহরণস্বরূপ, এমন কোনও সার্ভারের জন্য একটি এসকিউএল সার্ভার অবজেক্ট তৈরি করার জন্য যা উপস্থিত নেই (আমার ক্ষেত্রে "ব্লে"), পাওয়ারশেল লাল রঙের অনেকগুলি পাওয়ারশেল ত্রুটি প্রদর্শন করে।

যেহেতু আমার স্ক্রিপ্টটি এই $?জাতীয় কলগুলির পরে ডিসপ্লে এবং লগগুলি ত্রুটির মূল্য পরীক্ষা করে , তাই পাওয়ারশেলের ত্রুটিগুলির বেশ কয়েকটি লাইনও প্রদর্শিত হবে না।

কীভাবে আমার স্ক্রিপ্টের জন্য প্রদর্শিত হচ্ছে তাদের নিষ্ক্রিয় করতে পারি?

উত্তর:


140

আপনার কাছে কয়েকটি বিকল্প রয়েছে। সবচেয়ে সহজ ErrorActionসেটিংস ব্যবহার করে জড়িত ।

-Erroractionসমস্ত সেমিডলেটগুলির জন্য সর্বজনীন পরামিতি। যদি এমন কোনও বিশেষ কমান্ড থাকে যা আপনি অগ্রাহ্য করতে চান তবে আপনি ব্যবহার করতে পারেন -erroraction 'silentlycontinue'যা মূলত সেই আদেশ দ্বারা উত্পন্ন সমস্ত ত্রুটি বার্তাগুলি উপেক্ষা করবে। আপনি Ignoreমানটি (পাওয়ারশেল 3+ তে) ব্যবহার করতে পারেন :

সাইলেন্টলি কনটিনিউয়ের বিপরীতে, উপেক্ষা করুন $ ত্রুটি স্বয়ংক্রিয় চলকটিতে ত্রুটি বার্তা যুক্ত করে না।

আপনি যদি কোনও স্ক্রিপ্টের সমস্ত ত্রুটি উপেক্ষা করতে চান, আপনি সিস্টেম ভেরিয়েবলটি ব্যবহার করতে পারেন $ErrorActionPreferenceএবং একই জিনিসটি করতে পারেন :$ErrorActionPreference= 'silentlycontinue'

দেখুন about_CommonParameters -ErrorAction সম্পর্কে আরও তথ্যের জন্য। দেখুন about_preference_variables $ ErrorActionPreference সম্পর্কে আরও তথ্যের জন্য।


আপনার কি 'এককথায়' নিঃশব্দে 'চালানোর একক উদ্ধৃতি দরকার? ইন্টেলিজিস বিকল্পগুলি দেখাচ্ছে এবং একক উদ্ধৃতি যোগ করছে না।
পিএস

4
যদি উপরের ফর্ম্যাটটি আপনার পক্ষে কাজ না করে তবে উপরের লিঙ্কটি উল্লেখ করুন। আমাকে -ErrorAction:SilentlyContinueপিএস 5.1 তে ফর্ম্যাট করতে হয়েছিল। আমি আমার সেমিডলেটটি ব্যাচ থেকে কল করছিলাম তাই আমি জানি না যে এটি কোনও পার্থক্য করে কিনা। আপনি যখন গ্রহণযোগ্য ত্রুটি জানেন তখন কিন্তু ভাল তথ্য নিক্ষেপ করা হতে পারে।
ডেভিড

--rm \ Windows.old \ -Force -Recurse -Verbose -ErrorAction SilentlyContinue -WarningAction SilentlyContinue </ কোড>।
Tertius Geldenhuys

18

উইন্ডোজ পাওয়ারশেল ত্রুটিগুলি প্রতিবেদন করার জন্য দুটি প্রক্রিয়া সরবরাহ করে: ত্রুটিগুলি বন্ধ করার জন্য একটি প্রক্রিয়া এবং ত্রুটি -বিহীন ত্রুটিগুলির জন্য আরেকটি প্রক্রিয়া ।

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

প্রাক্তন:

try
{
  Your database code
}
catch
{
  Error reporting/logging
}

অভ্যন্তরীণ সিএমডিলেটস কোডটি WriteErrorযখন সিএমডিলেট ইনপুট অবজেক্টগুলি প্রক্রিয়াকরণ চালিয়ে যেতে পারে তখন নন-টার্মিনেটিং ত্রুটিগুলির প্রতিবেদন করার জন্য একটি পদ্ধতি কল করতে পারে। স্ক্রিপ্ট লেখক এরপরে বার্তাগুলি লুকানোর জন্য -ErrorAction বিকল্পটি ব্যবহার করতে পারেন বা $ErrorActionPreferenceপুরো স্ক্রিপ্ট আচরণ সেটআপ করতে ব্যবহার করতে পারেন।


8

হোস্টের নাম ব্যবহার করে সমাধান করার চেষ্টা করার সময় আমারও একই সমস্যা হয়েছিল [system.net.dns]। যদি আইপি সমাধান না করা হয়। নেট একটি সমাপ্তি ত্রুটি ছুড়ে ফেলেছে। সমাপ্তি ত্রুটি রোধ করতে এবং এখনও আউটপুট নিয়ন্ত্রণ বজায় রাখতে, আমি ব্যবহার করে একটি ফাংশন তৈরি করেছি TRAP

ইজি

Function Get-IP 
{PARAM   ([string]$HostName="")
PROCESS {TRAP 
             {"" ;continue} 
             [system.net.dns]::gethostaddresses($HostName)
        }
}

3

আপনি এখানে ট্র্যাক বন্ধ।

আপনার কাছে ইতিমধ্যে একটি দুর্দান্ত, বড় ত্রুটির বার্তা রয়েছে। কেন পৃথিবীতে আপনি এমন কোড লিখতে চান যা প্রতিটি কমান্ডের$? পরে পরিষ্কারভাবে পরীক্ষা করে ? এটি অত্যন্ত জটিল এবং ত্রুটিযুক্ত প্রবণ। সঠিক সমাধানটি চেক$? করা বন্ধ করুন

পরিবর্তে, পাওয়ার শেলের বিল্ট ইন মেকানিজমটি আপনার জন্য ফুটিয়ে তুলুন। আপনি সর্বোচ্চ স্তরে ত্রুটি পছন্দ সেট করে এটি সক্ষম করুন :

$ErrorActionPreference = 'Stop'

আমি এটি লিখি প্রতিটি একক স্ক্রিপ্টের শীর্ষে রেখেছি এবং এখন আমাকে চেক করতে হবে না $?। এটি আমার কোডকে বিস্তৃত সহজ এবং আরও নির্ভরযোগ্য করে তুলেছে।

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

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

অতিরিক্ত নির্ভরযোগ্যতা

আপনি কঠোর মোড ব্যবহার করে বিবেচনা করতে পারেন :

Set-StrictMode -Version Latest

আপনি যখন অস্তিত্বহীন পরিবর্তনশীল এবং অন্যান্য উদ্ভট পরিস্থিতিতে ব্যবহার করেন তখন পাওয়ারশেলটি নিঃশব্দে এগিয়ে যাওয়া থেকে বাধা দেয়। ( -Versionএটি কী কী সীমাবদ্ধ করে সে সম্পর্কে বিশদের জন্য প্যারামিটারটি দেখুন ))

এই দুটি সেটিংসের সংমিশ্রণ পাওয়ারশেলকে অনেক বেশি ব্যর্থ-তাত্পর্যপূর্ণ ভাষায় পরিণত করে, যা এতে প্রোগ্রামিংকে অত্যন্ত সহজ করে তোলে।



2

কিছু ক্ষেত্রে আপনি আউট-নাল কমান্ডের পরে পাইপ করতে পারেন

command | Out-Null

-1

আপনি যদি দমন করা কোনও সেমিডলেটের জন্য পাওয়ারশেল ত্রুটিমাফিকটি চান তবে তবুও ত্রুটিটি ধরতে চান, "-ররেকশন 'নীরবতার সাথে থামুন" "


এরকম কোনও পদক্ষেপ নেই। পর্যাপ্ত পরিমাণে একটি স্টপ অ্যাকশন রয়েছে।
মার্ভিন ডিখাউস

তবে এটি লাল ত্রুটির বার্তাটি দমন করতে দেয় এবং এখনও ব্যবহার করার সময় ক্যাচ কমান্ড / বিভাগটি ব্যবহার করে New-Item -ItemType directory(পাওয়ারশেল
ভি

@ মিলানকর্সেলার আপনি দয়া করে কোনও কোড নমুনা দেখাতে পারেন - যেহেতু আমি এবং অন্য প্রত্যেকে বিশ্বাস করি যে 'সাইলেন্টলিস্টপ' এর মতো কোনও অ্যাকশনপ্রিয়েন্স নেই
এফএসসিকুর

আমি যুক্তিসঙ্গতভাবে আত্মবিশ্বাসী যে মিক্কেল নিঃশব্দে থামার চেয়ে সাইলেন্টলি কনটিনিউকে বোঝায়, কারণ এটি আপনি কী করতে চান তা বিষয়বস্তুতে এটি আরও অনেক বেশি অর্থবোধ করে।
জন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.