با استفاده از PowerShell Try، Catch و در نهایت برای استفاده از خطا [Tutorial]
خطا ها متأسفانه بخشی طبیعی برای نوشتن کد هستند. نحوه رسیدگی به آنها می تواند بین یک اسکریپتی که به زیبایی متوقف می شود و آن حذف قسمت های بزرگی از سیستم شما ، تفاوت ایجاد کند. در PowerShell ، یکی از موثرترین و رایج ترین راه های مقابله با خطاها ، استفاده از بلوک های PowerShell Try / Catch است.
بلوک های Try / Catch روند نوشتن کد را ساده تر می کنند و به شما امکان می دهند خطاهایی را بگیرید که به طور معمول توسط PowerShell نادیده گرفته می شوند ، اما که به طور بالقوه می تواند عواقب فاجعه آمیز داشته باشد. Try / Catch همچنین بخش مهمی از فرآیند خطای گسترده تری شماست ، که باید به گونه ای طراحی شده باشد تا بتوانید به راحتی تمام خطاهایی را که ایجاد می کنید اسکریپت های شما را مشاهده کنید.
دوره آموزشی ویدیو PowerShell و Active Directory Essentials را دریافت کنید
این را برای کاربران جدید و پیشرفته PowerShell توصیه می کنم. ساختن ابزار AD یک تجربه یادگیری عالی است.
در این مقاله ما تفاوت های ظریف عملکرد خطاها در PowerShell را بررسی خواهیم کرد و چگونه می توانید از Try / Catch برای محدود کردن پیامدهای آنها استفاده کنید. ما شما را از موضوعات زیر استفاده خواهیم کرد:
نحوه کار خطاها در PowerShell
قبل از اینکه به بررسی خطا در PowerShell بپردازید ، می پردازد که کمی در مورد راهکار خطاها در خود PowerShell کار می کنند. ما کمی در مورد نحوه کارکرد خطاها در PowerShell در آموزشهای PowerShell و در راهنمای ما برای شروع کار با اسکریپتینگ AD صحبت کرده ایم ، اما در این مقاله ، ما به طور خاص به خطاها می پردازیم.
سطح اساسی ، دو نوع خطا در PowerShell وجود دارد: خاتمه دادن و عدم خاتمه. PowerShell ، به طور پیش فرض ، فقط انواع خاصی از خطاها را می گیرد و در صورت انجام این کار ، از اسکریپت اجرا شده خارج می شود. اینها به عنوان خطاهای خاتمه دهنده شناخته می شوند. اگر در نحو خود اشتباه کنید ، یا حافظه را تمام نکردید ، این یک خطای خاتمه است.
خطاهای خاتمه خطرناک تر هستند. اگر یکی از این موارد رخ دهد ، به طور پیش فرض PowerShell کار خود را ادامه خواهد داد. این نوع خطا می تواند عواقب قابل توجهی برای سیستم شما داشته باشد زیرا به طور معمول نمی دانید خطایی ایجاد شده است.
در اینجا مثال خوبی از خطر خطاهای خاتمه نیافته است. بیایید بگوییم که یک مدیر سیستم در Varonis انتظار دارد که بخش HR ما به طور مرتب لیستی از کارمندان خود را که باید به بانک اطلاعات هزینه های ما دسترسی داشته باشند بارگذاری کند. اگر نامی در این لیست از HR نیست ، ما یک اسکریپت می نویسیم تا به طور خودکار آن شخص را از این گروه جدا کنیم تا آنها نتوانند مطالبه هزینه کنند. در اینجا یک اسکریپت اساسی برای دستیابی به این هدف وجود دارد:
$ AuthorizedUsers = دریافت-محتوا \ FileServer HRShare UserList.txt
$ CurrentUsers = Get-ADGroupMember "هزینه های مدعیان"
Foreach ($ کاربر در $ فعلی استفاده کنندگان)
{
اگر ($ AutorizedUsers - حاوی $ کاربر نیست)
{
حذف-ADGroupMember - اعتبار "هزینه های مدعیان" - کاربر $ کاربر
}
}
متن را بخوانید ، و خواهید دید که چه اتفاقی می افتد. اگر HR فراموش شود که لیست را بارگذاری کند ، PowerShell خطایی را در cmdlet Get-Content پرتاب می کند. متأسفانه ، این یک خطای خاتمه نیافته است ، بنابراین فیلمنامه همچنان اجرا خواهد شد. و از آنجا که متغیر $ AuthorizedUsers خالی است ، همه را از گروه هزینه ها حذف می کند. سپس سرپرست سیستم ما شروع به دریافت سیل از تماس های تلفنی عصبانی از کارکنان شرکت می کند.
این نوع مشکل دقیقاً همان چیزی است که فرآیندهای دست زدن به خطا را برای جلوگیری از آن هدف می دهد ، و دستور Try / Catch ابزاری مهم در اجرای این فرایندها است. . با این حال ، ابتدا بیایید کمی عمیق تر به چگونگی برخورد با خطاها بپردازیم.
$ Error Automatic Variable
هنگام جستجوی استراتژی مدیریت خطا ، دانستن آن مفید است. کمی در مورد نحوه برخورد PowerShell به طور پیش فرض. همانطور که قبلاً در راهنماهای PowerShell [link to hub] توضیح داده ایم ، PowerShell دارای چندین متغیر خودکار است که از آن برای ذخیره اطلاعات در مورد سیستم شما استفاده می کند. یکی از اینها و یکی دیگر از متغیرهای مهم ، متغیر خطای خودکار $ Error است.
این متغیر آرایه تمام خطاهایی را که در یک جلسه مشاهده می کنید ، مرتب سازی بر اساس آخرین خطا ، ذخیره می کند. هنگامی که برای اولین بار جلسه PowerShell را شروع می کنید ، متغیر $ Error خالی خواهد بود ، اما هنگامی که خطایی ایجاد می کنید ، در این متغیر افزوده و ذخیره می شود.
شما می توانید با متغیر $ Error درست مانند هر نرم افزاری کار کنید. آرایه. با استفاده از $ Error.count ، می توانید تعداد خطاها را در متغیر ذخیره کنید ، یا به عنوان مثال با فراخوانی موقعیت آن در آرایه ، به هر خطای فردی دسترسی پیدا کنید. به یاد داشته باشید که نمایه سازی آرایه از صفر شروع می شود ، بنابراین ، برای تماس با جدیدترین خطای شما می توانید خطای $ 19459039 را اجرا کنید.
خواص $ Error Object
همانطور که می دانید با PowerShell کار کرده اید یا خیر. مدتی است ، همه چیز در PowerShell یک شی است و به همین ترتیب به همه چیز تعدادی از خواص اختصاص داده می شود که به شما امکان کنترل بیشتر و اطلاعات بیشتر در مورد آن را می دهند. متغیر $ Error نیز از این قاعده مستثنی نیست. بنابراین ، می توان در مورد شیء $ Error صحبت کرد و ویژگی های آن را توصیف کرد.
می توانید خصوصیات متغیر $ Error را به همان روشی که با هر شی دیگر انجام می دهید بازیابی کنید:
$ Error | عضو-عضو
این یک لیست گسترده از تمام ویژگیهای موجود برای متغیر را برمی گرداند:
Metals Equals
bool Equals (System.Object obj)
GetHashCode Method
int GetHashCode ()
GetObjectData روش
System.Void GetObjectData (System.Runtime.Serialization.Serialization
روش GetType
نوع GetType ()
روش ToString
string ToString ()
CategoryIn Management.Automation.ErrorCategInfo CategoryInfo {get؛}
ErrorDetails Properties
System.Management.Automation.ErrorDetails ErrorDetails {get؛ set؛؛
استثناء املاک
] FullyQualifiedErrorId املاک
System.String FullyQualifiedErrorId {get؛}
InvocationInfo Properties
System.Management.Automation.InvocationInfo InvocationInfo 656501Antoect.it01Pitation ion`1 [[SystemInt32،
TargetObject Properties
System.Object TargetObject {get؛}
PSMessageDetails ScriptProperty
System.Object PSMessageDetails {get = get = 19659013] از این میان ، یکی از مهمترین ویژگی ویژگی InvocationInfo است که اطلاعات مربوط به دلیل یک خطای خاص را در اختیار دارد. برای دسترسی به این ویژگی ، اجرا کنید: [خطای
$ [0]. InvocationInfo
همانطور که مشاهده می کنید ، این اطلاعات با جزئیات بیشتری راجع به این ملک برمی گرداند. برای دسترسی به اطلاعات در مورد سایر خطاهای ذخیره شده در متغیر $ Error می توانید از همان ترکیب استفاده کنید ، با شماره های مختلف فهرست بندی آرایه.
خطاهای خاتمه چیست؟
همانطور که در بالا توضیح دادیم ، دو نوع خطا در PowerShell وجود دارد: خاتمه دادن و عدم خاتمه. برای تهیه یک استراتژی سختگیرانه در مورد خطا ، باید در مورد هر دو بدانید. بنابراین نگاهی عمیق تر به هر دو نوع خواهیم داشت.
خطاهای خاتمه دادن به جریان اجرای PowerShell ، خواه در یک دستور و یا به صورت اسکریپت ، متوقف می شوند. بسیاری از خطاهای خاتمه مختلف وجود دارد ، و توسط بسیاری از cmdlets ایجاد می شود. یک روش معمول که در آن یک خطای خاتمه رخ می دهد این است که اگر شما یک cmdlet را با پارامتری که وجود ندارد تماس بگیرید.
به عنوان مثال ، اگر با یک فرایند قانونی دستور Get-Proction را فراخوانی کنید - بیایید بگوییم "Notepad" - دستور معتبر است و خروجی عادی را نشان می دهد. اما اگر سعی می کنید از پارامتری استفاده کنید که مربوط به دستور Get-Process نباشد ، "-handle 251" را بگویید ، cmdlet بدون نشان دادن خروجی ، اجرای آن متوقف می شود و اطلاعات مربوط به خطا را برمی گرداند.
PowerShell خاتمه خطاها به روش زیر با بروز این نوع خطا ، cmdlet با فراخوانی متد System.Management.Automation.Cmdlet.Throwterminatingerror * خطا را گزارش می دهد. این روش به cmdlet امکان ارسال خطایی را می دهد که شرط ایجاد خطای خاتمه را توصیف می کند.
وقتی متد System.Management.Automation.Cmdlet.Throwterminatingerror * نامیده می شود ، زمان اجرای Windows PowerShell به طور دائم اجرای خط لوله متوقف می شود. و استثناء System.Management.Automation.Pipelinestoppedexception را پرتاب می کند. هرگونه تلاش بعدی برای تماس با System.Management.Automation.Cmdlet.WriteObject ، System.Management.Automation.Cmdlet.WriteError یا چندین API دیگر باعث می شود که این تماسها به استثناء System.Management.Automation.Pipelinestoppedexception استثناء دهند.
System .Automation.Pipelinestoppedexception استثنا همچنین می تواند رخ دهد اگر cmdlet دیگری در خط لوله خطای خاتمه را گزارش کند ، اگر کاربر خواسته است خط لوله را متوقف کند یا اینکه خط لوله قبل از اتمام به هر دلیلی متوقف شده است. cmdlet نیازی به گرفتن استثناء System.Management.Automation.Pipelinestoppedexception ندارد ، مگر آنكه باید منابع باز یا وضعیت داخلی خود را تمیز كند.
Cmdlets قبل از گزارش خطای خاتمه ، می تواند هر تعداد اشیاء خروجی یا خطاهای غیرقانونی را بنویسد. با این حال ، خطای خاتمه دهنده خط لوله را به طور دائمی متوقف می کند ، و هیچ گونه خروجی ، خطای خاتمه یا خطای غیر خاتمه نمی تواند گزارش شود.
خطاهای غیر انتهایی چیست؟
نوع دوم خطا در PowerShell یک خطای بدون خاتمه است. این خطاها اجرای اسکریپت یا یک دستور را متوقف نمی کند ، هر دو با وجود مواجهه با خطا ، عملکرد خود را ادامه می دهند.
ساده ترین نمونه یک خطای غیر خاتمه زمانی است که شما سعی می کنید به پرونده ای که وجود ندارد دسترسی پیدا کنید. در این حالت ، PowerShell گزارش خواهد داد که نمی تواند پرونده را پیدا کند ، اما اجرای فرمان یا اسکریپت شما را متوقف نمی کند. به عنوان مثال ، در اینجا یک اسکریپت وجود دارد که لیستی از اسامی پرونده ها را از پرونده پرونده های listlist.txt دریافت کند ، سپس برای گذر از هر نام پرونده ، مطالب هر پرونده را بخوانید و آن را بر روی صفحه نمایش خروجی کنید:
$ file_list = دریافت کنید -قطع. filelist.txt
foreach (پرونده $ $ در $ file_list) {
نوشتن و خروجی "خواندن پرونده $ $"
دریافت پرونده با محتوای $
}
بیایید بگوییم که محتوای filelist.txt به شرح زیر است:
File_1.log
پرونده_2.log
پرونده_3.log
پرونده_4.log
پرونده_5.log
File_6.log
پرونده_7.log
File_8.log
پرونده_9.log
File_10.log
اما اگر یکی از این پرونده ها در واقع وجود نداشته باشد چه می شود؟ در این حالت ، اسکریپت اجرا می شود ، سپس خطایی را با متن قرمز گزارش می دهد و سپس از طریق لیست پرونده های خود به اجرای آن ادامه می دهد. به عبارت دیگر ، این کار خاتمه نیافته است.
نحوه گزارش PowerShell در مورد خطاهای خاتمه نیز با نحوه گزارش در مورد خاتمه خطاها متفاوت است. هنگامی که خطای عدم خاتمه رخ می دهد ، cmdlet باید این خطا را با استفاده از روش System.Management.Automation.Cmdlet.WriteError گزارش دهد. هنگامی که cmdlet خطای عدم خاتمه را گزارش می دهد ، cmdlet می تواند به کار در این شی ورودی و اشیاء خط لوله ورودی دیگر ادامه دهد. اگر cmdlet به روش System.Management.Automation.Cmdlet.WriteError بنامد ، cmdlet می تواند یک پرونده خطا را بنویسد که شرط ایجاد خطای عدم خاتمه را توصیف می کند.
Cmdlets می توانند با System.Management.Automation.Cmdlet.WriteError تماس بگیرند. در صورت لزوم از طریق روشهای پردازش ورودی آنها. با این حال ، cmdlets می توانند با System.Management.Automation.Cmdlet.WriteError فقط از موضوعی که System.Management.Automation.Cmdlet.BeginProcessing ، System.Management.Automation.Cmdlet.ProcessRecord یا System.Management.Automation نامیده می شوند تماس بگیرند. روش پردازش ورودی EndProcessing.
System.Management.Automation.Cmdlet.WriteError را از نخ دیگری صدا نکنید. در عوض ، خطاهای ارتباطی را دوباره به موضوع اصلی ببخشید.
$ ErrorActionPreferenceVariable
حالا شما می دانید که تفاوت بین خطاهای خاتمه و عدم خاتمه چیست ، باید بدانید که چرا خطاهای عدم خاتمه بسیار خطرناک هستند. از آنجا که یک اسکریپت یا دستور به کار خود ادامه می دهد حتی اگر خطای غیر خاتمه ای رخ دهد ، می تواند به راحتی باعث ایجاد ویرانی در سیستم های شما شود.
به همین دلیل ، PowerShell راهی را برای شما فراهم می کند تا به شما بگویید که با همه خطاها به عنوان خاتمه رفتار کنید. . این گزینه توسط متغیر $ ErrorActionPreference کنترل می شود. این یکی از متغیرهای ترجیحی در PowerShell است که به شما امکان می دهد شیوه رفتار محیط PowerShell خود را کنترل کنید.
به طور پیش فرض ، متغیر $ ErrorActionPreference روی "ادامه" تنظیم می شود. این بدان معنی است که اسکریپت پس از مواجهه با خطا به اجرای خود ادامه خواهد داد. اگر مقدار این متغیر را به "STOP" تغییر دهید ، PowerShell با کلیه خطاها به عنوان خطای خاتمه رفتار خواهد کرد.
اکنون می توانیم کد مورد استفاده در بالا را تغییر دهیم - برای خواندن لیستی از پرونده ها و خروجی مطالب آنها - به منظور درمان. پرونده گم شده به عنوان یک خطای خاتمه دهنده به عنوان مثال:
# مقدار $ ErrorActionPreference را روی STOP تنظیم کنید
$ ErrorActionPreference = "STOP"
$ file_list = دریافت-محتوا. filelist.txt
foreach (پرونده $ $ در $ file_list) {
نوشتن و خروجی "خواندن پرونده $ $"
دریافت پرونده با محتوای $
}
حال ، اگر اسکریپت را بر روی همان پرونده filelist.txt که قبلاً از آن استفاده کرده ایم ، اجرا کنیم ، در پرونده_6.log متوقف می شود ، زیرا وجود ندارد.
تغییر مقدار پیش فرض متغیر $ ErrorActionPreference از این طریق هنگام نوشتن کد جدید می تواند بسیار مفید باشد و می خواهید مطمئن شوید که خسارت تصادفی ایجاد نمی کنید. همچنین توجه داشته باشید که مقدار $ ErrorActionPreference فقط در جلسه فعلی PowerShell معتبر است. به محض شروع جلسه PowerShell ، به مقدار پیش فرض بازنشانی می شود.
با این حال ، باید این را نیز بدانید که در بسیاری از موارد خطاهای عدم خاتمه در PowerShell باعث نمی شوند که به دلایل خوبی دستورات یا اسکریپت ها متوقف شود: اغلب ، تغییر همه خطای یک خطای خاتمه بسیاری از اسکریپت های شما را که در غیر این صورت به خوبی اجرا می شوند ، قفل می کند.
پارامتر مشترک ErrorAction
یک روش دیگر برای تأثیرگذاری خطاهای PowerShell به عنوان خاتمه وجود دارد: پارامتر ErrorAction.
مقدار $ ErrorActionPreference برای جلسه PowerShell اعمال می شود ، پارامتر ErrorAction برای هر cmdlet که از پارامترهای مشترک پشتیبانی می کند ، اعمال می شود. پارامتر ErrorAction همان مقادیری را می پذیرد که متغیر $ ErrorActionPreference انجام می دهد.
توجه داشته باشید که مقدار پارامتر ErrorAction بر ارزش ErrorActionPreference مقدم است و هر دو در همان جلسه قابل استفاده هستند. برای مثال ، بیایید از همان کد فوق استفاده کنیم ، اما این بار پارامتر ErrorAction را به خط Get-Content اضافه کنیم:
# مقدار $ ErrorActionPreference را به طور پیش فرض تنظیم کنید (ادامه)
$ ErrorActionPreference = "ادامه"
$ file_list = دریافت-محتوا. filelist.txt
foreach (پرونده $ $ در $ file_list) {
نوشتن و خروجی "خواندن پرونده $ $"
# از پارامتر مشترک -ErrorAction استفاده کنید
دریافت-محتوی $ پرونده-ErrorAction STOP
}
اگر این کد را به همان روشی که قبلاً اجرا کردیم ، وقتی به پرونده_6.log برسد باز هم خاتمه می یابد. دلیل این امر این است که ، حتی اگر $ ErrorActionPreference "ادامه" داده شود ، پارامتر -ErrorAction اولویت دارد.
خطای استفاده: بلوک های PowerShell Try-Catch چیست؟
[19659002] اکنون می دانید که PowerShell چگونه با خطاها مقابله می کند ، و برخی از تکنیک های اساسی برای تأثیرگذاری در نحوه انجام این کار ، شما احتمالاً می دانید که با این خطاها چه باید بکنید. اینجاست که بلوک های Try / Catch وارد می شوند.
بلوک های Try / Catch در واقع راهی برای پرتاب نرده ها بر روی یک قطعه کد خاص و گرفتن خطاهای موجود در آن است. نحو اصلی بلوک Try / Catch به شرح زیر است:
سعی کنید
}
گرفتن [[] ['،'] *]
}
در اینجا ، شما به PowerShell می گویید که کدهای موجود در بلوک اول را امتحان کنید ، و بر روی آن خطا نظارت کنید. اگر هر کد خطایی را ایجاد کند ، به متغیر $ Error اضافه می شود و سپس به بلوک Catch منتقل می شود.
بلوک Catch شامل دستورالعمل هایی است که در صورت دریافت خطاها از بلوک سعی کنید. این می تواند پاسخهای پیچیده ای را برای هر نوع خطایی که ممکن است با آن روبرو شوید ، داشته باشد و از چندین بلوک Catch نیز می توانید برای همان عبارت Try استفاده کنید.
سرانجام ، یک بخش اختیاری دیگر از بلوک های Try / Catch وجود دارد: بلوک نهایی. این شامل کدی است که بعد از اجرای بلاک اجرا خواهد شد ، و این کد هرگونه خطایی را که توسط بلاک آزمایش انداخته شده است اجرا خواهد شد.
یک مثال ساده از Try / Catch / در نهایت
قبل از اینکه وارد دنیای واقعی شویم. برنامه های بلوک Try / Catch ، ارزش دارد که با یک مثال اساسی در مورد نحوه استفاده از نحو تمرین کنید. به عنوان مثال ، برای انجام یک بررسی ساده از فهرست کاربر AD خود ، می توانید از:
$ Users = دریافت-محتوا C: temp usersimport.txt استفاده کنید
foreach ($ کاربر در $ کاربران) {
تلاش كردن {
دریافت-ADUser - اطلاعات $ کاربر | خارج از تهی
نوشتن و خروجی "$ user وجود دارد"
}
گرفتن {
نوشتن-خروجی "$ کاربر وجود ندارد"
}
}
همانطور که مشاهده می کنید ، در صورت عدم یافتن کاربر ، این کد یک پیام خطای توصیفی و مفید را برمی گرداند.
نحوه استفاده از PowerShell Try-Catch Blocks
بیایید کمی فراتر از این مثال عمومی برویم ، و از مثالی که تاکنون با آن کار کرده ایم ، از یک بلوک Try / Catch استفاده کنیم.
یکی از اساسی ترین اجرای بلوک های Try / Catch به سادگی است. اجازه دهید قسمت Catch از بلوک همه خطاها را بگیرد و یک پیام خطای عمومی بازگرداند. در کد زیر ، همانطور که مشاهده می کنید ، عبارت foreach درون بلوک Try محصور شده است. سپس ، یک بلوک Catch حاوی کد است تا در صورت بروز خطا ، رشته An Error رخ داده را نمایش دهد. کد موجود در بلاک اخیر فقط متغیر خطای $ را پاک می کند:
$ file_list = دریافت-محتوا. \ filelist.txt
تلاش كردن {
foreach (پرونده $ $ در $ file_list) {
نوشتن و خروجی "خواندن پرونده $ $"
دریافت-محتوی $ پرونده-ErrorAction STOP
}
}
گرفتن {
نوشتن-میزبان "خطایی رخ داده" -ForegroundColor RED
}
سرانجام {
$ Error.Clear ()
}
اگر این کد را در همان filelist.txt و پرونده هایی که قبلاً امتحان کرده ایم ، اجرا کنید ، خواهید دید که به File_6.log می رسد ، و سپس خارج می شود. همچنین "خطایی رخ داده" به رنگ قرمز بر می گردد. این یک شروع عالی برای پردازش خطا است زیرا شما خطایی را انجام داده اید. با این حال ، پیام خطا در اینجا بسیار مفید نیست.
اینجاست که خصوصیات متغیر $ Error که در بالا به آن اشاره کردیم مفید است. شما می توانید به بلوک گرفتن بگویید تا ویژگی Exception از خطاهای ایجاد شده را نشان دهید ، نه یک پیام عمومی. به عنوان مثال:
$ file_list = دریافت-محتوا. filelist.txt
تلاش كردن {
foreach (پرونده $ $ در $ file_list) {
نوشتن و خروجی "خواندن پرونده $ $"
دریافت-محتوی $ پرونده-ErrorAction STOP
}
}
گرفتن {
نوشتن-میزبان $ PSItem.Exception.Message -ForegroundColor RED
}
سرانجام {
$ Error.Clear ()
}
اکنون ، همانطور که می بینید دوباره این کد را اجرا می کنید ، پیام خطا توصیفی بسیار بیشتر است.
ابتلا به خطاهای خاص
در حالی که گرفتن خطاهای غیر اختصاصی یک روش خوب است زیرا در حال تهیه کد جدید هستید ، با توجه به اینکه پروژه شما بالغ می شود ، می خواهید خطاهای خاصی را بدست آورید و دستورالعمل هایی را برای پاسخ به هر یک تهیه کنید.
نوع خطا برای هر خطایی که در متغیر $ Error وجود دارد ، در مقدار TypeName از ویژگی Exception موجود است. به عنوان مثال ، برای یافتن نوع خطای آخرین خطایی که به آرایه $ Error اضافه شده است ، اجرا کنید:
$ Error [0] .Exception | Get-Member
با استفاده از این تماس ، می توانید خطای مربوط به خطا را از هر خطایی که ایجاد می شود رهگیری کنید و به طور مشخص با آن مقابله کنید. در اینجا مثالی وجود دارد که از متن بالا اصلاح شده است ، که در آن اکنون دو بلوک Catch وجود دارد. اولین بلوک Catch نوع خاصی از خطا را متوقف می کند (System.Management.Automation.ItemNotFoundException). در مقابل ، بلوک Catch دوم حاوی پیام خطایی عمومی ، همه گیر است:
$ file_list = دریافت-محتوا. filelist.txt
تلاش كردن {
foreach (پرونده $ $ در $ file_list) {
نوشتن و خروجی "خواندن پرونده $ $"
دریافت-محتوی $ پرونده-ErrorAction STOP
}
}
گرفتن [System.Management.Automation.ItemNotFoundException]
نوشتن-میزبان "پرونده $ $ یافت نشد." -ForegroundColor RED
}
گرفتن {
نوشتن-میزبان $ PSItem.Exception.Message -ForegroundColor RED
}
سرانجام {
$ Error.Clear ()
}
اگر این کد را مانند گذشته اجرا کنید ، می بینید که اکنون خطا به روشی بسیار مؤثرتر گزارش شده است. در صورت بروز هر نوع خطای دیگر ، پیام خطای عمومی نمایش داده می شود.
استفاده از بلوک های Try / Catch برای ورود به خطا
مراحل فوق به شما امکان می دهد یک سیستم کنترل خطای کارآمد و کارآمد بسازید ، اما شما همچنین باید اطمینان حاصل کند که شما حداقل خطائی را که زندگی می کند ، خطایی را که ایجاد می کنید وارد کرده اید. می توانید این کار را با استفاده از همان نحو Try / Catch که در بالا استفاده کرده ایم انجام دهید. مراحل انجام این کار در اینجا آمده است:
- پارامتر ErrorAction را برای هر دستوری که نیاز به اجرای خطا دارد متوقف کنید. در صورت بروز خطا ، اجرای فرمان متوقف می شود و پیام خطا را نشان می دهد. همانطور که در بالا ذکر شد ، در اینجا ما برای خاتمه دادن به خطا در خاتمه ، خطاهای غیر خاتمه را انجام می دهیم.
- دستوری که دارای یک پارامتر ErrorAction است که برای مقدار Stop تنظیم شده است ، در یک بلوک Try apped پیچیده می شود. . هنگامی که یک خطا رخ می دهد ، پردازش کد از بلوک Try به بلوک Catch پرش می شود.
- در بلوک Catch {that که بلافاصله پس از بلوک Try {follows دنبال می شود ، با نوشتن فایل ورود به سیستم خطا روی این خطا رسیدگی می شود.
- سپس می توانید از نوشتن ErrorLog CmdLet در داخل Catch {} استفاده کنید تا خطا را در یک فایل متنی روی دیسک بنویسید.
- این cmdlet دارای یک پارامتر خطای سوئیچ اضافی است تا تصمیم بگیرد که آیا می خواهید بنویسید. خطایی در پرونده log یا نیست. این کاملاً اختیاری است.
- در صورت لزوم از بلوک {Finally استفاده کنید.
- کل تنظیم را با شکستن عمدا کد در مرحله توسعه تست کنید.
- اگر برخی از تماس های cmdlet شما برنامه ریزی شده است ، شما همچنین باید روال عملی را برای بررسی حداقل حداقل یک بار در هفته پرونده متنی Error Log وارد کنید و خطاهای گرفتار را بررسی کنید.
A Final Word
بلوک های امتحان / گرفتن در PowerShell بخش مهمی از ساخت یک خطای مؤثر هستند. سیستم. از آنها می توان برای کنترل ایمن بلوک های کد برای خطاها و ایجاد پاسخ های خاص برای هر نوع خطا استفاده کرد. این کارکرد بسیار ارزشمند است ، چه در حال ساخت پروژه های جدید باشید و چه می خواهید پروژه های بالغ را قابل استفاده تر کنید.
در این راهنما ، ما اصول استفاده از Try / Catch Blocks در PowerShell را به شما نشان داده ایم. با این حال ، اگر می خواهید بیشتر به پیش بروید ، می توانید راهنمای ما را به روشهای پیشرفته تر استفاده از اشیاء PowerShell و داده های لوله کشی ، و نحوه بهبود بهره وری PowerShell خود با استفاده از ابزارهایی که در دسترس است ، بررسی کنید.
