تكون الملفات في حالة تدفق مستمر على أي نظام تشغيل. في بعض الأحيان يتم إنشاؤها، وأحيانًا يتم حذفها، وأحيانًا يتم تغييرها، وهذه كلها أشياء عادية يقوم بها نظام التشغيل. في بعض الأحيان، عندما يتم تغيير ملف، يمكن أن يسبب عدم الاستقرار في تطبيق آخر يعتمد عليه، مثل تغيير رقم المنفذ في ملف خصائص، أو معلمة في بيان النشر، أو حتى إصلاح التعليمات البرمجية في الإنتاج دون المرور عبر التحكم بالمصادر.
وكجزء من إدارة أنظمة التشغيل هذه، يحتاج المهندسون إلى طريقة لمشاهدة ما يحدث لهذه الملفات المهمة واتخاذ الإجراءات اللازمة عند حدوث شيء ما. أدخل .NET فئة FileSystemWatcher و باورشيل.
في .NET و.NET Core، يعد FileSystemWatcher فئة تعيش في مساحة الاسم System.IO وتراقب الملفات. في PowerShell، يمكن أن يكون هذا مفيدًا جدًا، خاصة عندما يتم دمجه مع وظائف PowerShell الأخرى.
إنشاء مثيل FileSystemWatcher
قم بإنشاء مثيل لهذه الفئة في PowerShell عن طريق التشغيل
$watcher = New-Object System.IO.FileSystemWatcher
. بمجرد القيام بذلك، ستحتاج إلى إخباره بالمجلد الذي تريد مشاهدته. يمكنك القيام بذلك عن طريق تعيين معلمة المسار على كائن FileSystemWatcher على مسار المجلد الذي تريد مشاهدته. إذا كان لديك مجلد على نظام التشغيل Windows يسمى WatchThisFolder ضمن C:، فيمكنك تعيين FileSystemWatcher على ذلك عن طريق تشغيل
$watcher.Path = 'C:WatchThisFolder'
.
نظرًا لأن هذه الفئة موجودة أيضًا في .NET Core، يمكنك القيام بكل هذا على نظام Linux أو Mac OS بنفس الطريقة التي تفعلها على نظام Windows. على سبيل المثال، إذا كان لديك مجلد على نظام التشغيل Ubuntu Linux يسمى WatchThisFolder ضمن دليل المستخدم الحالي لديك، فستقوم بتشغيل
$watcher.Path = '/home/ubuntu/WatchThisFolder'
.
تعمل بقية نماذج التعليمات البرمجية الموجودة في هذه المقالة على أي من النظامين الأساسيين دون أية تغييرات.
تشغيل الأحداث من FileSystemWatcher
الآن بعد أن أصبح لديك كائن FileSystemWatcher جديد، يمكنك إلقاء نظرة أسفل الغطاء ومحاولة اكتشافه. لرؤية الأنواع المحددة من أحداث نظام الملفات التي يراقبها FileSystemWatcher، أدخل
$watcher | Get-Member -MemberType Event
. احصل على عضو يعرض كل ما يحتوي عليه الكائن الذي تم تمريره إليه، ومن خلال إضافة مرشح MemberType، يمكنك رؤية فئة معينة، في هذه الحالة، الأحداث.
تلك الأحداث هي:
- تغيرت
- مخلوق
- تم الحذف
- التخلص منها
- خطأ
- تمت إعادة تسميته
عندما يتم اكتشاف واحد أو أكثر من أحداث FileSystemWatcher هذه في المسار الذي تم تعيين الكائن لمشاهدته، فإن كائن المراقب يثير حدثًا خارجيًا، والذي يمكنك تحديد الإجراءات له.
الآن بعد أن عرف كائن المراقب ما يجب مشاهدته، وتعرف الأحداث التي يراقبها، يجب عليك تعيينه لرفع حدث عند اكتشاف إجراء ما. افعل ذلك عن طريق الجري
$watcher.EnableRaisingEvents = $true
. فكر في هذه العلامة كمفتاح تشغيل/إيقاف لـ
$watcher
: إذا كان المفتاح في وضع إيقاف التشغيل، فلن يحدث شيء إذا تم إجراء أي تغييرات. يمكنك أيضًا إخباره بالنظر إلى الملفات والمجلدات المتداخلة أسفل المجموعة الموجودة في المسار عن طريق تغيير علامة IncludeSubdirectories إلى true بنفس الطريقة التي قمت بها بعلامة EnableRaisingEvents.
تحديد الإجراءات التي يجب اتخاذها
بمجرد إعداد كائن المراقب، يجب عليك منحه إجراءً لتنفيذه بمجرد اكتشاف هذا التغيير. يمكن أن يكون هذا بسيطًا مثل الكتابة إلى سجل النظام، أو جذريًا مثل تشغيل استبدال المثيل من خلال سحب نظيف للكود المصدر. للبدء، تحتاج إلى تحديد كتلة الإجراء في التعليمات البرمجية. إليك واحد يكتب فقط إلى وحدة التحكم:
$action = {$path = $event.SourceEventArgs.FullPath
$name = $event.SourceEventArgs.Name
$changetype = $event.SourceEventArgs.ChangeType
Write-Host "File $name at path $path was $changetype at $(get-date)"
}
يمكنك أن ترى أن هذا الرمز يسحب المتغيرات من الحدث باستخدام ملف $event
المتغير الذي يتم إنشاؤه لك عندما يتم إنشاء الحدث بواسطة كائن المراقب. بمجرد انتهاء الحدث، ينتهي المتغير أيضًا، مما يعني أنه لن يحتوي إلا على البيانات ذات الصلة بهذا الحدث.
باستخدام سجل-ObjectEvent
إذن، لقد قمت بإعداد FileSystemWatcher، ولديك الإجراءات التي تريد اتخاذها كلما حدث شيء ما. في الوقت الحالي، هذان الشخصان منفصلان ولا يعرفان شيئًا عن بعضهما البعض. ولجعلهم يعملون معًا، يجب عليك تسجيل الإجراءات مع الحدث. يحتوي PowerShell على أمر cmdlet كامل لهذا — سجل-ObjectEvent cmdlet. لاستخدام Register-ObjectEvent، يجب عليك تمرير ثلاثة أشياء:
- كائن FileSystemWatcher
- نوع الحدث الذي سيتم تشغيل الإجراءات عليه
- الإجراءات التي حددتها سابقًا
إذا قمت بإعداد كل شيء بنفس الطريقة المذكورة أعلاه، فسيبدو الأمر كما يلي: Register-ObjectEvent $watcher 'Event Action' -Action $action.
يمكن استبدال “إجراء الحدث” بأي حدث من FileSystemWatcher، ولكن هذا سيشكل عرضًا توضيحيًا رائعًا.
اختبارها
الآن يمكنك اختبار كل شيء. في هذا القسم، ستقوم بإنشاء ملف جديد في الدليل المحدد، ورؤية إجراء الحدث، ثم تعطيل الحدث وإلغاء تسجيله.
لإنشاء ملف جديد وتشغيل الحدث، قم بتشغيل السطر أدناه في PowerShell. هذا موجود على نظام التشغيل Ubuntu Linux، ولكن إذا كنت تتابعه على نظام التشغيل Windows، فاستبدل /home/ubuntu/ بـ C: و / بـ .
New-Item -Path "/home/ubuntu/WatchThisFolder/newFile" -ItemType File
بمجرد إدخال ذلك، ينطلق الحدث ويبدأ الإجراء.
File newFile at path /home/ubuntu/WatchThisFolder/newFile was Created at 09/26/2019 20:49:54
يتم تشغيله في كل مرة تقوم فيها بإنشاء ملف جديد في هذا الدليل أو أي شيء متداخل تحته، إذا قمت بتمكين علامة IncludeSubdirectories. الآن بعد أن عرفت أن رفع الحدث يعمل، اذهب وأوقف تشغيله عن طريق التشغيل $watcher.EnableRaisingEvents = $false
، ثم حاول إنشاء ملف جديد. يجب إنشاء الملف، ولكن لا يظهر أي حدث. يمكن أن يكون هذا مفيدًا جدًا إذا كنت تقوم بتصحيح الأخطاء ولا تريد تشغيل أي شيء أثناء العمل في نظام الملفات.
بمجرد الانتهاء من ذلك، تشغيل Get-EventSubscriber | Unregister-Event
لإلغاء تسجيل الحدث من الإجراء. الآن، حتى لو كانت علامة EnableRaisingEvents صحيحة وحدث الإجراء، فلن يتم إطلاق الإجراء.
(العلامات للترجمة)مايكروسوفت