فحص PowerShell لأمر Test-Path: التحقق من الملفات، المفاتيح، والمزيد

إذا كنت بحاجة إلى التحقق من صحة مسار إلى ملف أو مفتاح سجل أو شهادة أو أي مسار آخر لـ PowerShell drive ، فستحتاج إلى أمر Test-Path.

أمر Test-Path هو طريقة بسيطة ولكنها مفيدة للتحقق بسرعة من العديد من السمات لملف وعناصر أخرى. يمكنه التحقق مما إذا كان الملف موجودًا (أو أنواع عناصر أخرى) ، وما إذا كان السلسلة في تنسيق المسار الصحيح ، أو حتى ما إذا كان العنصر أحدث من وقت محدد أو أقدم منه.

في هذا البرنامج التعليمي ، ستتعلم كل ما تحتاج إلى معرفته عن أمر PowerShell Test-Path وكيفية استخدامه لتحسين نصوص PowerShell الخاصة بك.

المتطلبات المسبقة

إذا كنت ترغب في متابعة الأمثلة في هذا البرنامج التعليمي ، فستحتاج إلى شيء واحد ؛ PowerShell. على وجه التحديد ، ستستخدم البرنامج التعليمي PowerShell v7.03 على Windows 10 ، على الرغم من أن العديد من التقنيات التي ستتعلمها ستنطبق أيضًا على الإصدارات الأقدم.

ما الذي يفعله أمر Test-Path؟

أمر PowerShell Test-Path هو واحد من أبسط الأوامر الموجودة. إنه أمر كان موجودًا في PowerShell منذ البداية ويعيد قيمتين فقط ؛ صحيح أو خاطئ.

ولكن ، لا تدع البساطة يخدعك ؛ فإنه سيوفر لك الكثير من الوقت في التحقق من المعلومات في نصوص PowerShell الخاصة بك.

اعتبر أمر الـ PowerShell Test-Path كأداة لمراقبة الجودة عند العمل مع مزودات ومحركات الـ PowerShell. عند كتابة نص، ستعمل عادةً مع عناصر مختلفة تحتويها محركات الـ PowerShell. محركات الـ PowerShell مثل C:\، HKLM، Cert، وما إلى ذلك.

Test-Path لا يعمل مع جميع محركات الـ PS. على سبيل المثال، إذا حاولت استخدام Test-Path ضد مفتاح سجل، فسيعمل. إذا حاولت استخدام Test-Path ضد قيمة سجل، فسيعيد False في كل مرة.

إذا كنت متشوقًا، قم بتشغيل أمر Get-PSDrive الآن في PowerShel ولاحظ جميع محركات الـ PS التي تظهر لك.

PS Drives after running Get-PSDrive

كل هذه المحركات تحتوي على مسارات داخلها مثل C:\Windows، HKLM:\Software، وما إلى ذلك. عند العمل مع المسارات داخل نصوص PowerShell الخاصة بك، دائمًا ما يكون من الجيد الممارسة أولاً اختبار ما إذا كان المسار صالحًا أم لا. هذا ما يفعله أمر Test-Path.

Test-Path يحدد شرطًا يعيد True أو False اعتمادًا على ما إذا كان الشرط محققًا (عادةً ما يتعلق بما إذا كان ملف/مجلد، مفتاح سجل، شهادة، أو حتى متغير موجودًا أم لا).

معلمات واستخدامات Test-Path

مثل العديد من سطور الأوامر في PowerShell، يحتوي سطر الأمر Test-Path على معلمات مختلفة تغير سلوكه. دعنا نغطي الآن كل معلمة ونوضح كيفية عملها ونوع النتائج التي قد تتوقع رؤيتها.

المسار

المعلمة Path هي معلمة إلزامية ستستخدمها مع كل تنفيذ لـ Test-Path. تحدد المعلمة Path مسار محرك PSDrive الذي ترغب في اختبار وجوده.

إذا، على سبيل المثال، كنت ترغب في اختبار ما إذا كان المجلد C:\Foo موجودًا أم لا، يمكنك توفير المسار المناسب لمعلمة Path. ثم، اعتمادًا على ما إذا كان C:\Foo موجودًا فعليًا أم لا، سيقوم Test-Path بإرجاع True أو False.

PS> Test-Path -Path 'C:\Foo'
True

يمكن استخدام نفس التقنية لأي مسار عنصر أيضًا. ربما ترغب في اختبار ما إذا كانت المفتاح السجل HKLM:\Software\Foo موجودة. ما عليك سوى استخدام مسار المفتاح السجل مع معلمة Path.

PS> Test-Path -Path 'HKLM:\Software\Foo'
True

تذكر أن جميع التقنيات التي تم عرضها خلال هذا البرنامج التعليمي ستعمل مع أي مسار لمحرك PowerShell.

استخدام الرموز المتعددة

ماذا يحدث إذا لم يكن لديك اهتمام بقيمة حرفية للمسار؟ بدلاً من ذلك، ترغب فقط في التحقق مما إذا كان المسار يتطابق مع نمط معين. في هذه الحالة، يمكنك استخدام الرموز المتعددة في قيمة Path.

ربما ترغب في التحقق مما إذا كان المجلد C:\Foo يحتوي على أي مجلد فرعي يبدأ بـ Bar. في هذه الحالة، يمكنك استخدام رمز وحيد.

PS> Test-Path -Path 'C:\Foo\Bar*'

مرة واحدة تنفذ الأمر أعلاه، سيتحقق Test-Path من وجود مجلد يبدأ بـ Bar ويعيد True أو False اعتمادًا على ما إذا كان هناك أي مجلد يطابق ذلك المعيار أم لا.

النجوم (*) تطابق حرف واحد أو أكثر ولكن يمكنك أيضًا استخدام علامات الاستفهام (?) للحصول على تفاصيل أكثر دقة واختبار لحرف واحد فقط.

باستخدام السيناريو أعلاه كمثال، إذا كان المجلد C:\Foo\Bar1 موجودًا، يمكنك اختبار أي مجلد فرعي من Foo يبدأ بـ Bar ويكون بالضبط من أربعة أحرف باستخدام الأمر أدناه.

PS> Test-Path -Path 'C:\Foo\Bar?'

إذا كنت، لأي سبب من الأسباب، ترغب في استخدام معلمة Path باستخدام الرموز البارزة ولكن تريد تطابق حرف واحد مثل * حرفيًا، يمكنك دائمًا تفادي حرف البارزة باستخدام علامة النقل العكسي (`).

LiteralPath

معلمة LiteralPath مطابقة تقريبًا لمعلمة Path باستثناء واحد؛ حيث أنها لا تسمح بالرموز البارزة. باستخدام LiteralPath، ستفسر قيمة المسار حرفيًا.

على سبيل المثال، إذا حاولت استخدام النجمة أو علامة الاستفهام داخل قيمة المسار باستخدام LIteralPath، سيتجاهل Test-Path تمامًا الرموز البارزة ويختبر حرفيًا لـ C:\Foo\Bar? مثل المثال أدناه.

PS> Test-Path -LiteralPath 'C:\Foo\Bar?'

يجب عليك استخدام LiteralPath كمعلمة المسار الافتراضية إذا لم تكن بحاجة إلى استخدام أي رموز بارزة لضمان أن Test-Path يختبر المسار الذي تتوقعه.

PathType

افتراضيًا، عند تشغيل Test-Path وتقديمه مسارًا، سيُعيد True إذا وجد أي شيء في ذلك المسار. العنصر بمسار يمكن أن يكون حاوية مثل مجلد ملف، مفتاح سجل، متجر الشهادات، وهلم جرا، أو ورقة مثل ملف، قيمة سجل، أو شهادة.

يمكنك إجبار Test-Path على الحصول على تفاصيل أكثر واختبار بشكل محدد لعنصر الحاوية أو الورقة باستخدام معلمة PathType.

يستخدم Test-Path قيمة PathType Any افتراضيًا.

إذا، على سبيل المثال، كان هناك مجلد في C:\Foo\Bar وكنت تبحث عن ملف في ذلك المسار، يمكنك استخدام معلمة PathType كما هو موضح أدناه. تريد فقط التحقق مما إذا كان هناك ملف يسمى C:\Foo\Bar.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Leaf

ربما بدلاً من ذلك، تحتاج إلى التحقق مما إذا كان C:\Foo\Bar في الواقع ملفًا. في هذه الحالة، ستتحقق من الحاوية.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Container

تضمين

إذا كنت تستخدم معلمة Path والرموز المرجعية، قد تحتاج في بعض الأحيان إلى التحديد بشكل أكبر. في هذه الحالة، تحتاج إلى النظر في المعلمات Include و Exclude.

لنفترض أن لديك المجلدات التالية:

  • C:\Foo\Bar1
  • C:\Foo\Bar2
  • C:\Foo\Bar3

ترغب في التحقق مما إذا كان هناك أي مجلد يبدأ بـ Bar ويكون بالضبط من أربعة أحرف مثل Bar1، Bar2، إلخ.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container

الأمر أعلاه يعمل بشكل جيد، ولكن الآن تريد فقط العثور على مجلدات في C:\Foo تسمى Bar2. في هذه الحالة، يمكنك استخدام معلمة Include.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container -Include 'Bar2'

الأمر أعلاه الآن يختبر أساساً مجلدًا واحدًا C:\Foo\Bar2. ربما ستكون أفضل لك ببساطة استخدام Test-Path -Path 'C:\Foo\Bar2' -PathType Container بدلاً من ذلك.

استبعاد

المعلمة Exclude تعمل بنفس الطريقة التي تعمل بها معلمة Include باستثناء أنها تستبعد المسارات التي تطابق سلسلة معينة.

ربما ترغب في التأكد من وجود ملف واحد على الأقل داخل مجلد C:\Foo، وتستخدم الأمر التالي:

PS> Test-Path -Path C:\Foo\* -PathType Leaf

الأمر أعلاه يعيد True أو False إذا كانت هناك ملفات في C:\Foo. ولكن ربما ترغب في التأكد من وجود أي ملفات باستثناء تلك التي لديها امتداد ملف txt. في هذه الحالة، يمكنك استخدام المعلمة Exclude باستخدام بادئ متعدد لاستبعاد جميع الملفات ذات امتداد txt من الاختبار.

PS> Test-Path -Path C:\Foo\* -PathType Leaf -Exclude *.txt

تصفية

وفقًا لوثائق مايكروسوفت، تحدد المعلمة Filter “تصفية بتنسيق أو لغة مزود البيانات. قيمة هذه المعلمة تؤهل كمعلمة Path. بناء الجملة للتصفية، بما في ذلك استخدام أحرف البدائل، يعتمد على مزود البيانات”.

على الرغم من أنه يجب استخدام المعلمة Filter مع أمرات cmdlet أخرى مثل Get-Childitem، على سبيل المثال، فإنه نادراً ما يتم استخدامها مع Test-Path. إذا وجدت استخدامًا جيدًا لمعلمة Filter، يرجى التواصل عبر تويتر على @adbertram.

ذات الصلة: Get-ChildItem: قائمة الملفات والسجل والشهادة والمزيد كواحد

NewerThan

هل سبق لك أن احتجت إلى التحقق من الطابع الزمني على ملف واتخاذ قرار بناءً عليه؟ إذا كان الأمر كذلك، فإن معلمات NewerThan و OlderThan توفر الكثير من الشفرة. تحقق معلمة NewerThan ما إذا كان طابع الزمن للعنصر أحدث من تاريخ معين.

تقبل معلمة NewerThan سلسلة نصية أو كائن DateTime لتمثيل الطابع الزمني الذي يجب فحصه. على سبيل المثال، للتحقق ما إذا كان الملف C:\Foo\bar.txt تم إنشاؤه بعد 20 يناير 2021، يجب عليك تشغيل Test-Path كما في الأسفل.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan 'January 20, 2021'
## أو
Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan '1/20/21'

OlderThan

معلمة OlderThan تمامًا كما في NewerThan لكن بالعكس. هذه المعلمة تتحقق ما إذا كان العنصر أقدم من تاريخ معين.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan 'January 20, 2021'
## أو
Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan '1/20/21'

IsValid

إذا كنت قد بنيت مسارًا ديناميكيًا في سكريبت، فستعرف التحدي. أحيانًا قد تخطئ في إدخال حرف أو تحصل بطريقة ما على حرف خاص في المسار؛ إذا كان الأمر كذلك، فإن معلمة IsValid مناسبة لك.

معلمة IsValid هي معلمة فريدة تحول Test-Path، ليس إلى cmdlet يتحقق من وجود عنصر، ولكن إلى واحد يتحقق من صيغة المسار. تؤكد هذه المعلمة ما إذا كان المسار صالحًا أم لا فقط.

بمثال، ربما تحتاج إلى التحقق مما إذا كان المسار صحيحًا بصورة تركيبية. أنت تعمل مع مجموعة من المتغيرات وتقوم بدمجها لبناء مسار.

عند دمج المسارات، استخدم دائمًا cmdlet Join-Path. هذا مثال فقط لأغراض التوضيح!

$someVar = 'abc:dff'
$rootPath = 'C:\'
$path = "$someVar$rootPath

الآن لضمان أن المسار الذي قمت بإنشاءه ديناميكيًا صحيح، استخدم معامل IsValid كما في الأسفل. ستجد أن Test-Path يعيد False.

PS> Test-Path -LiteralPath $path -IsValid
False

المسار abc:dffC:\ ليس مسارًا صحيحًا الآن مما يتيح لك إنشاء روتين التحقق من الصحة في هذا السياق.

إذا كنت تستخدم PowerShell v6.1.2 أو أقدم وتستخدم معاملي IsValid و PathType معًا، سيتجاهل Test-Path معامل PathType.

Credential

على الرغم من وجود معامل Credential على cmdlet Test-Path، قد تعتقد أنه يمكنك استخدامه للمصادقة على محركات PS كمستخدم آخر. هذا افتراض صحيح، ولكنه خاطئ.

للأسف، لا يقوم معامل Credential بكثير مع cmdlet Test-Path. توصي Microsoft باستخدام cmdlet Invoke-Command واستخدام معامل Credential هناك إذا كنت ترغب في استدعاء Test-Path باستخدام اعتمادات بديلة.

Invoke-Command -Credential (Get-Credential) -Scriptblock {Test-Path -LiteralPath 'C:\'}

ذات صلة: Invoke-Command: أفضل طريقة لتشغيل الشيفرة عن بعد

Source:
https://adamtheautomator.com/powershell-test-path/