التحقق من وجود ملف PowerShell: دليل شامل

user: هل تستخدم powershell لإنشاء، قراءة، تحديث وحذف الملفات؟ إذا كنت كذلك، فربما واجهت أخطاء عندما لا تكون الملفات المستهدفة موجودة أو تكون موجودة بالفعل. محظوظًا بالنسبة لك، هناك طرق في powershell للتحقق مما إذا كان الملف موجودًا قبل القيام بأي شيء به.

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

Creating a file that already exists

في هذا المقال، ستتعلم الطرق المختلفة لاستخدام powershell للتحقق مما إذا كان الملف موجودًا. ستتعلم أيضًا كيفية استخدام كل هذه الطرق لإنتاج كود أفضل ونتائج مع منطق معالجة الأخطاء.

المتطلبات الأساسية

تقليل مكالمات مكتب الخدمة وتحديث بيانات اعتماد ذاكرة التخزين المؤقت للمستخدمين عن بُعد حتى خارج vpn باستخدام حلاً لإعادة تعيين كلمة المرور ذاتية الخدمة. احصل على عرض توضيحي لـ specops ureset!

هذا المقال هو دليل تعليمي تتعلم من خلاله من أمثلة مختلفة. ولمتابعة الأمثلة، ستحتاج أيضًا إلى ما يلي:

  • محرر الكود. الأنسب هي visual studio code و atom, اللذان يعملان عبر منصات متعددة. يمكنك أيضًا استخدام windows powershell ise إذا كنت تعمل على جهاز كمبيوتر يعمل بنظام التشغيل windows.
  • Windows PowerShell 5.1 (Desktop) أو PowerShell 7.1 (Core). الأوامر والنصوص البرمجية في هذا المقال تنطبق على كلتا النسختين من PowerShell. سواء كنت تستخدم Windows أو Linux أو macOS، فستكون على ما يرام طالما أن لديك PowerShell مثبتًا.

ذات الصلة: كيفية تنزيل وتثبيت PowerShell 7 على Windows وLinux وmacOS

استخدام PowerShell للتحقق مما إذا كان الملف موجودًا

يغطي هذا المقال ثلاث طرق لاستخدام PowerShell للتحقق مما إذا كان الملف موجودًا. تختلف استخدامات هذه الطرق الثلاث، ولكن المفهوم والهدف النهائي هما نفسهما. هذه الطرق الثلاث هي:

  • Test-Path Cmdlet.
  • Get-Item و Get-ChildItem Cmdlet.
  • System.IO.File Class.

سيتم تقديم أمثلة وعروض توضيحية لكل من هذه الطرق الثلاث، بما في ذلك كيفية استخدامها مع معالجة الأخطاء.

استخدام Test-Path

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

أدناه هو الصيغة الأساسية لجعل أمر Test-Path يعمل مع فحص ملف.

Test-Path -Path <PATH to FILE> -PathType Leaf

مثلاً، إذا كنت بحاجة للتحقق مما إذا كان ملف بالاسم C:\temp\important_file.txt موجودًا، استخدم الكود التالي. يجب ملاحظة أن الجزء -PathType Leaf يخبر الأمر الدالة على النظام بالتحقق من وجود ملف وليس دليل بشكل صريح.

Test-Path -Path C:\temp\important_file.txt -PathType Leaf

عند تشغيل الأمر أعلاه في PowerShell، ستعود النتيجة True إذا كان الملف موجودًا. وإلا، سيكون النتيجة False، كما يمكنك رؤيته في اللقطة الشاشية أدناه.

Using Test-Path in PowerShell to check if a file exists

ذات الصلة: كيفية استخدام الأمر الدالة Test-Path في PowerShell

مثال: إنشاء ملف إذا لم يكن الملف موجودًا

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

انسخ الكود أدناه واحفظه في ملف بالاسم Create-NewFile.ps1. تأكد من تغيير قيمة المتغير $path إذا كنت ترغب في تغيير موقع إخراج الملف. بعد حفظ البرنامج النصي، قم بتشغيله في PowerShell للاختبار.

# Create-NewFile.ps1

# Full path of the file
$file = 'c:\temp\important_file.txt'

# إذا كان الملف غير موجود، قم بإنشائه.
if (-not(Test-Path -Path $file -PathType Leaf)) {
     try {
         $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
         Write-Host "The file [$file] has been created."
     }
     catch {
         throw $_.Exception.Message
     }
 }
# إذا كان الملف موجودًا بالفعل، عرض الرسالة ولا تقم بشيء.
 else {
     Write-Host "Cannot create [$file] because a file with that name already exists."
 }

الصورة أدناه تظهر النتائج المختلفة. الأولى عند تشغيل السيناريو عندما لا يكون الملف موجودًا. الثانية بعد إنشاء الملف، حيث يكون موجودًا.

Running the PowerShell script to create a file

ذاكرة وصلة: العودة إلى الأساسيات: كيفية تشغيل سكربت PowerShell

استخدام Get-Item و Get-ChildItem

غرض cmdlet Get-Item هو الحصول على العنصر في موقع محدد. بالمقارنة، يستخدم cmdlet Get-ChildItem لـ الحصول على العناصر والعناصر الفرعية في مواقع محددة واحدة أو أكثر. لا يكون هدف هذين ال cmdlet تحقق إذا كانت الملفات موجودة صراحة.

ماذا يحدث عند استخدام Get-Item أو Get-ChildItem للحصول على عنصر غير موجود؟ ستحصل على خطأ لكل ملف مفقود. تأخذ الأوامر أدناه كمثال.

$file = 'c:\temp\important_file.txt'
Get-Item -Path $file
Get-ChildItem -Path $file

لنفترض أن الملف c:\temp\important_file.txt غير موجود. يعيد كل من الأوامر أعلاه خطأ. كما يمكنك رؤية من المثال أدناه، رسالة الخطأ لكلتا الأوامر هي نفسها.

Using Get-Item and Get-ChildItem in PowerShell to check if a file exists

مثال: أرشفة الملف الحالي وإنشاء ملف جديد

في هذا المثال، يستخدم السكربت cmdlet Get-Item و Test-Path. منطق هذا السكربت هو القيام بالتالي:

  • اختبار ما إذا كانت مجلد الأرشيف موجودة باستخدام Test-Path.
    • إذا لم يكن مجلد الأرشيف موجودًا، يقوم النص بإنشاء مجلد أرشيف جديد بهذا الشكل – yyyy-MMM-dd_hh-mm-ss-tt.
    • ثم، يقوم النص بنقل الملف القديم إلى مجلد الأرشيف.
  • اختبار ما إذا كان الملف موجودًا بالفعل باستخدام Get-Item.
    • إذا كان الملف موجودًا، يقوم النص بنقله إلى مجلد الأرشيف أولاً. ثم، يقوم النص بإنشاء الملف الجديد في الموقع الأصلي.
    • إذا لم يكن الملف موجودًا، يقوم النص بإنشاء الملف الجديد.

انسخ الكود أدناه واحفظه كـ Create-NewFileAfterArchive.ps1. بعد حفظ النص، قم بتشغيله في PowerShell وتحقق من النتائج.

# إنشاء-ملف-جديد-بعد-الأرشفة.ps1

# المسار الكامل للملف
$file = 'c:\temp\important_file.txt'

# المسار الكامل إلى مجلد الأرشفة
$archiveFolder = "c:\temp\archive_$(get-date -Format 'yyyy-MMM-dd_hh-mm-ss-tt')\"

# إذا كان الملف موجودًا، قم بنقله إلى مجلد الأرشفة، ثم إنشاء ملف جديد.
if (Get-Item -Path $file -ErrorAction Ignore) {
    try {
        ## إذا كان مجلد الأرشفة غير موجود، فقم بإنشائه الآن.
        if (-not(Test-Path -Path $archiveFolder -PathType Container)) {
            $null = New-Item -ItemType Directory -Path $archiveFolder -ErrorAction STOP
        }
        ## قم بنقل الملف الموجود إلى المجلد الأرشيف.
        Move-Item -Path $file -Destination $archiveFolder -Force -ErrorAction STOP
        Write-Host "The old file [$file] has been archived to [$archiveFolder]"
     } catch {
        throw $_.Exception.Message
     }
 }
 Create the new file
 try {
     $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
     Write-Host "The new file [$file] has been created."
 } catch {
    Write-Host $_.Exception.Message
 }

نصيحة: يقوم المعلمة -ErrorAction Ignore بكبت الخطأ (لن يظهر في الوحدة) وأيضًا لا يسجل الخطأ في المتغير التلقائي $error.

في الشاشة أدناه، قام التشغيل النصي الأول بإنشاء الملف c:\temp\important_file.txt. تنفيذات النصي اللاحقة أنشأت مجلد أرشيف جديد في كل مرة، تقوم بنقل الملف الموجود إلى مجلد الأرشيف، ثم تنشئ ملفًا جديدًا في c:\temp\important_file.txt.

Running a script in PowerShell to check if a file exists using Get-Item

استخدام طريقة .NET لـ [System.IO.File]::Exists()

آخر الطرق لتعلمها في هذا المقال هو فئة .NET System.IO.File، تحديدًا طريقة Exists(). أحد نقاط قوة باورشيل هو قدرته على استيراد واستخدام فئات وطرق .NET.

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

[System.IO.File]::Exists("PATH")

الطريقة أعلاه تُنتج نتيجة بولية – صحيحة أو خاطئة. إذا كانت النتيجة صحيحة، فهذا يعني أن الملف المستهدف موجود. وإلا، فإن النتيجة المُرجعة خاطئة عندما لا يكون الملف المستهدف موجودًا.

في الكود المثالي أدناه، يتحقق الأمر من وجود الملف c:\temp\important_file.txt.

$file = 'c:\temp\important_file.txt'
[System.IO.File]::Exists($file)

كما يمكن ملاحظة النتيجة أدناه، فإن النتيجة تعيد قيمة صحيحة، مؤكدة بأن الملف موجود.

Using System.IO.File class in PowerShell

باستخدام هذه الطريقة في .NET، يمكنك أيضًا استخدام عمليات التشعب مثل المثال أدناه. بدلاً من عرض النتائج الافتراضية المتكونة من صحيح أو خطأ، يمكنك تخصيص رسالة النتيجة بتنفيذ أقصر. ومع ذلك، ينطبق المشغل التشعبي في هذا المثال فقط على PowerShell 7+.

$file = 'c:\temp\important_file.txt'
[System.IO.File]::Exists($file) ? "The file exists." : "The file does not exist."

مثال: تحديث محتويات الملف إذا كان الملف موجودًا

يقوم هذا النص المثالي بتحديث ملف النص عن طريق إلحاق قيمة GUID جديدة. ومع ذلك، فإن تحديث المحتوى يحدث فقط إذا كان الملف موجودًا. وإلا، يظهر النص رسالة ولا يقوم بشيء آخر.

انسخ النص المثالي أدناه واحفظه بصيغة Update-FileContents.ps1. غيِّر قيمة مسار الملف للمتغير $file إذا لزم الأمر. ثم قم بتشغيل النص في PowerShell للاختبار.

# تحديث-محتوياتالملف.ps1

# المسار الكامل للملف
$file = 'c:\temp\important_file.txt'

# إذا كان الملف موجودًا، قم بإلحاق قيمة GUID جديدة في الملف.
if ([System.IO.File]::Exists($file)) {
    try {
        $newValue = ((New-Guid).Guid)
        Add-Content -Path $file -Value $newValue -ErrorAction STOP
        Write-Host "The file [$file] has been updated with [$newValue]"
     } catch {
        throw $_.Exception.Message
     }    
 }

# إذا لم يكن الملف موجودًا، أظهر رسالة ولا تقم بأي شيء.
 else {
     Write-Host "The file [$file] could not be updated because it does not exist."
 }

يمكنك أن ترى في اللقطة أدناه، قام السكربت بتحديث الملف خلال كل تشغيل. حدث التحديث لأن الطريقة [System.IO.File]::Exists() قد أكدت أن الملف c:\temp\important_file.txt موجود.

في النهاية، باستخدام الأمر gc c:\temp\important_file.txt لقراءة محتويات الملف، تم تأكيد أن السكربت قام بتحديث الملف بقيم GUID.

Using [System.IO.File]::Exists() .NET Method in PowerShell

ذات الصلة: استخدام مسرعات نوع بيانات PowerShell لتسريع البرمجة

الختام

تقليل مكالمات مكتب خدمة العملاء وتحديث بيانات اعتماد التخزين المؤقت للمستخدمين عن بُعد حتى خارج VPN باستخدام حلاً لإعادة تعيين كلمة المرور الخاصة بالخدمة الذاتية. احصل على عرض توضيحي لـ Specops uReset!

في هذا المقال، تعلمت أن هناك أكثر من طريقة لاستخدام PowerShell للتحقق مما إذا كان ملف موجودًا. من الممارسة الجيدة التحقق من وجود الملف قبل إجراء أي تعديلات تتعلق بالملف.

تعلمت عن استخدام الأوامر Get-Item، Get-ChildItem، و Test-Path. بالإضافة إلى طريقة [System.IO.File]::Exists() .NET. أظهرت الأمثلة لك كيفية استخدام التقنيات وكيفية دمجها مع منطق معالجة الأخطاء.

توقف عن تحمل تلك الرسائل الخطأ. تغلب عليها من خلال إضافة الشفرة للتحقق مما إذا كان الملف موجودًا قبل أي عمليات متعلقة بالملف. التقنيات التي تعلمتها هنا تغطي فقط الأساسيات، والآن عليك تحسينها.

Source:
https://adamtheautomator.com/powershell-check-if-file-exists/