أحد أهم منهجيات الترميز التي يجب اتباعها هو التأكد من أنك تعرف وتدير كل طريقة يمكن أن “تتدفق” بها الشيفرة الخاصة بك. إذا فكرت في الشيفرة الخاصة بك على أنها تدفق، فيمكن أن تتفرع، وتعود إلى نقاط مختلفة، وتواجه العديد من الشروط.
تضمن معالجة الأخطاء أنك تقوم بإعداد “شبكات” أو مكان افتراضي يمكن أن تتدفق إليه الشيفرة الخاصة بك عندما يحدث شيء غير متوقع.
دعنا نستخدم سيناريو من العالم الحقيقي قد تجد نفسك فيه، وهو التعامل مع معالجة أخطاء PowerShell.
بناء السكربت الأولي لتنظيف الملفات
نحتاج إلى تنظيف بعض الملفات القديمة. لقد كانت خوادم الملفات لدينا موجودة منذ الأبد، ونحتاج إلى تحرير بعض المساحة. قررت الإدارة إزالة جميع الملفات التي تزيد عمرها عن عدد محدد من الأيام. نحتاج إلى بناء سكربت يقوم بالبحث بشكل متكرر في مجلد، ويجد جميع الملفات التي تزيد عن عدد معين من الأيام، ويزيلها.
تبدو المهمة سهلة بما فيه الكفاية، ولكن هذه هي قسم معالجة الأخطاء، لذا تعلم أنك ستواجه بعض المشاكل!
دعنا نبدأ في فهم معالجة الأخطاء من خلال بناء السكربت التجريبي للسيناريو بدون معالجة الأخطاء لتوضيح المشكلة التي تحلها معالجة الأخطاء.
-
أولاً، افتح علامة تبويب جديدة في VS Code.
نظرًا لأننا نحاول بعض الأشياء الآن، فلن نقوم بحفظ السكربت بعد. أخبر VS Code مؤقتًا أنك على وشك كتابة بعض PowerShell.
اضغط على Ctrl-Shift-P، اكتب ‘lang’، اختر اختر وضع اللغة، اكتب ‘power’، واختر PowerShell. الآن يعرف VS Code أنك ستقوم بكتابة PowerShell.
-
بعد ذلك، قسّم المشكلة إلى مهام، مع حل الأكثر وضوحًا أولاً.
في هذه الحالة، تأتي المهمة بأمر لقراءة الملفات في دليل.
Get-ChildItem -Path C:\OldForgottenFolder
-
Get-ChildItem
تعيد أيضًا الأدلة التي لا نحتاجها، لذا دعنا نقصر ذلك على الملفات فقط.Get-ChildItem -Path C:\OldForgottenFolder -File
-
إذا كانت هناك ملفات في تلك الأدلة الفرعية، نحتاج إلى الحصول عليها أيضًا مع
Recurse
.Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse
-
الآن بعد أن حصلنا على الأمر والمعلمات، فإنه يعيد جميع الملفات. نحن بحاجة فقط إلى العثور على الملفات الأقدم من عدد معين من الأيام.
نظرًا لأن
Get-ChildItem
يعيد كل ملف مع خاصية كائنLastWriteTime
، يجب علينا التصفية بناءً على تلك الخاصية. سنستخدم فلترWhere
للعثور على الملفات التي تحتوي علىLastWriteTime
أقل من تاريخ محدد.(Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le ?????}
-
يجب أن يكون التاريخ ديناميكيًا لأن “قديم” اليوم سيكون مختلفًا عن “قديم” غدًا.
قم بتعليق السطر السابق لأننا سنحتاجه في مرحلة ما ثم نحدد حالة التاريخ.
## (Get-ChildItem -Path C:\\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le ?????} $Now = Get-Date $Now
-
الآن بعد أن لدينا تاريخ اليوم دعنا نجد عددًا محددًا من الأيام قبل اليوم لنجد التاريخ. سأضع فقط
30
هنا مؤقتًا لأنني أعلم أن بعض الملفات عمرها أكثر من خمسة أيام لإجراء اختبار بدائي.## (Get-ChildItem -Path C:\\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le ?????} $Now = Get-Date $LastWrite = $Now.AddDays(-30) $LastWrite
-
تم! دعنا نجمع ما لدينا حتى الآن.
$Now = Get-Date $LastWrite = $Now.AddDays(-30) (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
لدينا الآن نص صغير يجد جميع الملفات في دليل التي هي أقدم من عدد محدد من الأيام.
-
بعد ذلك، يجب علينا إضافة القدرة على إزالة تلك الملفات القديمة. هذا بسيط باستخدام الأمر
Remove-Item
وواجهة الأوامر.$Now = Get-Date $LastWrite = $Now.AddDays(-30) (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite} | Remove-Item
-
تم! ولكن انتظر، ليس لدي أي فكرة عن الملفات التي تمت إزالتها. كانت هناك أيضًا بعض الأخطاء التي سنتناولها بعد بضع دقائق. دعنا نضيف بعض الوظائف الأساسية.
$VerbosePreference = 'استمر' $Now = Get-Date $LastWrite = $Now.AddDays(-30) $oldFiles = (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite} foreach ($file in $oldFiles) { Remove-Item -Path $file.FullName Write-Verbose -Message "تمت إزالة [$($file.FullName)] بنجاح." }
-
ستحتاج إلى تضمين حلقة مثل هذه لتشغيل نوع ما من التعليمات البرمجية لكل ملف. هنا نحن لا نستخدم خط الأنابيب وبدلاً من ذلك نضع جميع الملفات الموجودة في متغير
oldFiles
، وهو مصفوفة من كائنات الملفات. ثم نقوم بتشغيلRemove-Item
على كل واحد كما في السابق، ولكن هذه المرة تشمل رسالة تفصيلية تخبرنا أي ملف يتم إزالته. -
لنقم الآن بتشغيل هذا الكود لنرى ماذا سيحدث.
يمكنك الآن أن ترى من خلال الرسالة المفصلة أنه تم إزالة بعض الملفات. الكود الذي لدينا الآن هو الأساس الذي نحتاجه لإنشاء السكربت. دعنا الآن ننشئ سكربت حقيقي من هذا في القسم التالي.
زيادة المرونة وإعادة الاستخدام مع المعلمات
لقد أنشأت سكربتك، لكنه لا يزال لديه القدرة على أن يكون مرنًا وقابلًا لإعادة الاستخدام. كيف؟ ستسمح لنا المعلمات بتحديد الدليل وعمر الملفات التي نريد استهدافها، مما يجعل السكربت أكثر مرونة.
-
قبل أن نذهب أبعد من ذلك، دعنا نحفظ عملنا. سمّيه Remove-FileOlderThan.ps1.
لاحظ تنسيق الفعل/الاسم مع شرطة. إذا كان ذلك ممكنًا، حاول دائمًا إنشاء أسماء السكربتات بنفس الطريقة التي تُستخدم بها أوامر PowerShell من أجل التناسق وسهولة القراءة.
-
أولاً، السكربتات مصممة لتكون قابلة لإعادة الاستخدام. من المحتمل أنك سترغب في استخدام هذا السكربت على أدلة مختلفة وأعمار مختلفة. سنحتاج إلى تقديم بعض المعلمات. للقيام بذلك، نحدد ما سيتغير. الدليل وعدد الأيام. فهمت.
param ( [Parameter(Mandatory)] [string]$FolderPath,
[Parameter(Mandatory)] [int]$DaysOld
)
$Now = Get-Date
$LastWrite = $Now.AddDays(-30)
$oldFiles = (Get-ChildItem -Path C:\OldForgottenFolder -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
foreach ($file in $oldFiles) {
Remove-Item -Path $file.FullName
Write-Verbose -Message "تمت الإزالة بنجاح [$($file.FullName)]."
}أضف كتلة
param
في الأعلى وعرّف كل معلمة كإلزامية حيث يجب أن يكون لدينا مسار ورقم ليعمل السكربت. أيضًا، حدد النوع هنا كأفضل ممارسة. -
استبدل العناصر الثابتة التي كانت لدينا في الكود سابقًا بقيم المعلمات.
param ( [Parameter(Mandatory)] [string]$FolderPath,
[Parameter(Mandatory)] [int]$DaysOld
)
$Now = Get-Date
$LastWrite = $Now.AddDays(-$DaysOld)
$oldFiles = (Get-ChildItem -Path $FolderPath -File -Recurse).Where{$_.LastWriteTime -le $LastWrite}
foreach ($file in $oldFiles) {
Remove-Item -Path $file.FullName
Write-Verbose -Message "تمت إزالة [$($file.FullName)] بنجاح."
} -
لنقم الآن بتشغيل السكربت ونرى ماذا سيحدث.
C:\Scripts\Remove-FileOlderThan.ps1 -FolderPath C:\OldForgottenFolder -DaysOld 30 -Verbose
يمكنك أن ترى كيف يجب علينا تحديد مسار المجلد وعدد الأيام كمعلمات. استخدم معامل
Verbose
لرؤية سطرWrite-Verbose
.عمل PowerShell السكربت تمامًا كما في السابق، لكن لدينا الآن سكربت معلمات يمكننا استخدامه على أي دليل أو أي عمر للملفات!
عند إلقاء نظرة على المخرجات، رأينا بعض النصوص الحمراء. إما أنك لا تملك الحقوق، أو أن الملف للقراءة فقط. لكن على أي ملفات فشل؟ وكيف تتأكد من إزالة تلك الملفات أيضًا؟
الخاتمة
في هذا الدرس، أنشأنا سكربت لتنظيف الملفات القديمة من دليل، مع ضمان المرونة من خلال إضافة معلمات. بينما يعمل السكربت كما هو مقصود، رأينا أن معالجة الأخطاء لم يتم تناولها بعد، وهو أمر بالغ الأهمية عند التعامل مع السيناريوهات الواقعية.
بينما نتقدم، سيسمح لنا إضافة إدارة الأخطاء بالتعامل مع المشكلات، مثل الأوامر التي تلقي أخطاء أو الملفات التي تكون غير قابلة للوصول، مما يساعدنا على تجنب إنهاء السكربت ويوفر رؤى مفصلة حول ما حدث خطأ.
تابعونا في العرض التقديمي التالي! PowerShell 101: الأخطاء القابلة للإنهاء وغير القابلة للإنهاء، وTry/Catch.
Source:
https://adamtheautomator.com/powershell-file-cleanup-script/