تمرين - التحكم بالتدفق
عندما تكتب برامج نصية، فقد تعمل على النحو المطلوب ما دمت تكتب قيمًا معقولةً. ولكن إذا مر الوقت أو شغَّل شخص آخر البرنامج النصي، فمن المحتمل أن يدخل شخص ما قيمة غير مقصودة أو أن بعض الشروط المسبقة الأخرى لن تُستوفى. لتجنب مواقف كهذه، يجب عليك تحسين إدخالك، أي أنه ينبغي عليك إضافة منطق إلى برنامجك النصي للتأكد من أنه يتوقف مبكرًا إذا كان هناك خطأ ما ويستمر في العمل فقط إذا كان كل شيء على ما يرام.
إشعار
هذا التمرين اختياري. إذا كنت ترغب في إكمال هذا التمرين، فستحتاج إلى إنشاء اشتراك Azure قبل البدء. إذا لم يكن لديك حساب Azure أو كنت لا ترغب في إنشاء حساب في الوقت الحالي، فيمكنك قراءة الإرشادات حتى تفهم المعلومات التي يتم تقديمها.
إشعار
في هذه الوحدة، يمكنك استخدام Azure Cloud Shell كمحطة طرفية. يمكنك الوصول إلى Cloud Shell من خلال مدخل Microsoft Azure أو تسجيل الدخول إلى Cloud Shell. لست مضطرا لتثبيت أي شيء على جهاز الكمبيوتر أو الكمبيوتر المحمول لاستخدامه.
إشعار
شغَّل الأوامر التالية فقط إذا لم تكن قد أكملت أياً من التمارين السابقة في هذه الوحدة. نفترض أنك أكملت التمارين السابقة. إذا لم تكن قد أكملتها، فقد تحتاج إلى عدد قليل من الملفات.
إذا لم تكن قد أكملت التمارين السابقة في هذه الوحدة، فشغَّل الأوامر التالية في نافذة طرفية:
mkdir webapp cd webapp touch index.html app.js cd ..ستنشئ هذه الأوامر دليلًا يحتوي على ملفات عادةً ما تكون مقترنة بتطوير الويب.
أضِف فحوصات إلى معلمات برنامجك النصي
لقد كنت تعمل مع برنامج نصي احتياطي حتى الآن، وكنت تضيف معلمات إليه. يمكنك جعل برنامجك النصي أكثر أمانًا للاستخدام عن طريق إضافة فحوصات تضمن استمرار البرنامج النصي فقط في حالة تزويد إدخالات معلمة معقولة له.
لننظر في السيناريو الحالي. إذا أكملت التمرين السابق، يجب أن يكون لديك ملف يسمى Backup.ps1. إذا لم يكن الأمر كذلك، فقم بإنشاء الملف وفتحه في محرر التعليمات البرمجية الخاص بك:
touch Backup.ps1
code Backup.ps1
أضف هذه التعليمة البرمجية إلى الملف:
Param(
[string]$Path = './app',
[string]$DestinationPath = './'
)
$date = Get-Date -format "yyyy-MM-dd"
Compress-Archive -Path $Path -CompressionLevel 'Fastest' -DestinationPath "$($DestinationPath + 'backup-' + $date)"
Write-Host "Created backup at $($DestinationPath + 'backup-' + $date + '.zip')"
كما تعلم، سيتوقف البرنامج النصي عن الاستجابة إذا كان $Path يشير إلى دليل غير موجود.
استخدم واجهة PowerShell موجودة، إذا كان لديك واحدة قيد التشغيل. وإلا، فابدأ تشغيل واحدة بكتابة
pwshفي محطة طرفية:pwshأضف فحص لمعلمة
$Pathعن طريق إضافة هذه التعليمة البرمجية مباشرةً بعد القسمParam، ثم احفظ الملف:If (-Not (Test-Path $Path)) { Throw "The source directory $Path does not exist, please specify an existing directory" }لقد أضفت اختبار يجري الفحص في حالة وجود
$Path. إذا لم يحدث ذلك، أوقِف البرنامج النصي. كما تشرح للمستخدمين ما حدث من أخطاء حتى يتمكنوا من حل المشكلة.تأكد من أن البرنامج النصي يعمل على النحو المطلوب من خلال تشغيله:
./Backup.ps1 -Path './app'ينبغي لك أن تشاهد هذا الإخراج:
Throw "The source directory $Path does not exist, please specify … | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | The source directory ./app does not exist, please specify an | existing directoryاختبر أن البرنامج النصي ما زال يعمل على النحو المطلوب. (تأكد من إزالة أية نسخ احتياطية من الملفات من التمرين السابق قبل المتابعة.)
./Backup.ps1 -Path './webapp'يجب أن تشاهد رسالة مشابهة لهذه الرسالة:
Created backup at ./backup-2021-01-19.zipإذا شغلت البرنامج النصي مرةً أخرى، سيتوقف عن الاستجابة. وسيخطرك أن الملف المضغوط موجود بالفعل. لنصلح تلك المشكلة. سنضيف تعليمة برمجية لضمان إنشاء النسخة الاحتياطية فقط في حالة عدم وجود نسخة احتياطية مضغوطة من الملف من اليوم الحالي.
استبدل هذه التعليمة البرمجية بالتعليمة البرمجية في هذا الملف، ثم احفظ الملف:
Param( [string]$Path = './app', [string]$DestinationPath = './' ) If (-Not (Test-Path $Path)) { Throw "The source directory $Path does not exist, please specify an existing directory" } $date = Get-Date -format "yyyy-MM-dd" $DestinationFile = "$($DestinationPath + 'backup-' + $date + '.zip')" If (-Not (Test-Path $DestinationFile)) { Compress-Archive -Path $Path -CompressionLevel 'Fastest' -DestinationPath "$($DestinationPath + 'backup-' + $date)" Write-Host "Created backup at $($DestinationPath + 'backup-' + $date + '.zip')" } Else { Write-Error "Today's backup already exists" }لقد فعلت شيئين هنا. أولًا، أنشأت متغيرًا جديدًا،
$DestinationFile. يسهل هذا المتغير التحقق مما إذا كان المسار موجودًا بالفعل. ثانيًا، أضفت منطقًا يقول "أنشئ الملف المضغوط فقط إذا لم يكن الملف موجوداً بالفعل." هذه التعليمة البرمجية تطبق هذا المنطق:If (-Not (Test-Path $DestinationFile)) { Compress-Archive -Path $Path -CompressionLevel 'Fastest' -DestinationPath "$($DestinationPath + 'backup-' + $date)" Write-Host "Created backup at $($DestinationPath + 'backup-' + $date + '.zip')" } Else { Write-Error "Today's backup already exists" }شغَّل التعليمات البرمجية للتأكد من عدم توقف البرنامج النصي عن الاستجابة ومن تطبيق منطقك:
./Backup.ps1 -Path './webapp'ينبغي لك أن تشاهد هذا الإخراج:
Write-Error: Today's backup already exists
تهانينا. لقد جعلت السيناريو خاصتك أكثر أمانًا قليلًا. (لاحظ أنه لا ما زال من الممكن تزويد إدخال مثير للمشاكل إلى $DestinationPath، على سبيل المثال.) الهدف من هذا التمرين هو إظهار كيفية إضافة الفحوصات. اعتمادًا على البيئة التي سيُشغل البرنامج النصي فيها، قد تحتاج إلى عدد أقل أو أكثر من الفحوصات. قد ترغب حتى في اختبارات كتابية؛ وكل هذا يتوقف على السياق.