אימות קיום קובץ ב-PowerShell: מדריך מקיף

האם אתה משתמש ב-PowerShell כדי ליצור, לקרוא, לעדכן ולמחוק קבצים? אם כן, ייתכן שחווית שגיאות כאשר הקבצים המטרה לא קיימים או כבר קיימים. מזל טוב לך, ישנן דרכים ב-PowerShell לבדוק האם קובץ קיים לפני שמתבצע פעולה כלשהי עליו.

לדוגמה, במקום לאפשר לקוד שלך ליצור את הקובץ מיד, נכון לבדוק האם הקובץ כבר קיים. כפי שמוצג בתמונה למטה, תוכל לכתוב קוד יותר טוב ולהשיג פלט ברור.

Creating a file that already exists

במאמר זה, תלמד את הדרכים השונות להשתמש ב-PowerShell לבדיקת קיום של קובץ. תלמד גם איך להשתמש בכל אחת מהדרכים אלו כדי ליצור קוד יותר טוב ותוצאות עם לוגיקת טיפול בשגיאות.

דרישות מקדימות

להפחתת שיחות לשולחן העזר ועדכון של פרטי כניסה למשתמשים מרוחקים אף כאשר אינם מחוברים ל-VPN עם פתרון לאיפוס סיסמה בשירות עצמי. קבל הדגמה של Specops uReset!

מאמר זה הוא מדריך שבו תלמד מדוגמאות שונות. וכדי לעקוב אחרי הדוגמאות, יידרשו אליך התקנים הבאים:

  • עורך קוד. המומלץ הם Visual Studio Code ו־Atom, אשר פועלים במגוון פלטפורמות. תוכל גם להשתמש ב-Windows PowerShell ISE אם אתה עובד על מחשב במערכת הפעלה Windows.
  • Windows PowerShell 5.1 (שולחן עבודה) או PowerShell 7.1 (ליבה). הפקודות והתסריטים במאמר זה חלים על שני המהדורות של 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

הדרך הראשונה היא באמצעות ה-cmdlet Test-Path, המיועד במיוחד לקבוע האם נתיב או קובץ קיימים. בעת השימוש ב-cmdlet זה כדי לבדוק אם קובץ קיים, התוצאה היא true או false. התוצאה מציינת האם הקובץ קיים או לא.

להלן התחביר הבסיסי כדי להשתמש ב-cmdlet Test-Path לבדיקת קובץ.

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

לדוגמה, אם תרצה לבדוק האם קובץ בשם C:\temp\important_file.txt קיים, ניתן להשתמש בקוד הבא. שים לב שחלק ה--PathType Leaf אומר ל-cmdlet לבדוק אם זהו קובץ ולא ספרייה באופן ספציפי.

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

כאשר אתה מפעיל את הפקודה בפוורשל, התוצאה תחזיר True אם הקובץ קיים. במקרה אחר, התוצאה תהיה False, כפי שניתן לראות בתמונה מטה.

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

נושא קשור: איך להשתמש ב-cmdlet Test-Path של PowerShell

דוגמה: יצירת קובץ אם הקובץ לא קיים

דוגמה זו היא תרחיש טיפוסי ליצירת קבצים במקום מסוים. כדי למנוע את השגיאה "הקובץ כבר קיים", התסריט בודק האם הקובץ כבר קיים לפני שיוצר אותו. אם הקובץ קיים, התסריט מציג הודעה ואינו מנסה ליצור את הקובץ שוב.

העתק את הקוד למטה ושמור אותו בקובץ בשם Create-NewFile.ps1. ודא ששינית את ערך המשתנה $path אם תרצה לשנות את מיקום הקובץ המוצג. לאחר שמירת התסריט, הפעל אותו בפוורשל לבדיקה.

# Create-NewFile.ps1

# הנתיב המלא של הקובץ
$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

מטרת פקודת ה-Get-Item היא ל- לקבל את הפריט במיקום מסוים. להשוואה, פקודת ה-Get-ChildItem היא ל- לקבל את הפריטים והפריטים הילדים במקומות מסוימים. פונקציונליותם של שתי הפקודות אינה באופן מפורש לבדיקה אם קבצים קיימים.

מה קורה כאשר אתה משתמש ב-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

דוגמה: ארכוב הקובץ הקיים ויצירת קובץ חדש

בדוגמה זו, התסריט משתמש בפקודות 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(). אחת מהיתרונות של PowerShell היא היכולת שלו לייבא ולהשתמש במחלקות ובשיטות מ-.NET.

לדוגמה, כדי להשתמש בשיטה Exists() ב-PowerShell כדי לבדוק אם קובץ קיים, השתמש בקוד הבא.

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

השיטה לעיל מחזירה תוצאה בוליאנית – true או false. אם התוצאה מחזירה true, זה אומר שהקובץ היעד קיים. להפך, התוצאה המוחזרת היא false כאשר הקובץ היעד לא קיים.

בקוד הדוגמה למטה, הפקודה בודקת אם הקובץ היעד קיים בנתיב c:\temp\important_file.txt.

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

כפי שניתן לראות מהתוצאה למטה, התוצאה מחזירה true, מאשרת כי הקובץ קיים.

Using System.IO.File class in PowerShell

עם שיטת .NET זו, ניתן גם להשתמש בפעולות טרנרי כמו בדוגמה למטה. במקום להציג את התוצאות הברירתיות של true או false, ניתן להתאים את הודעת התוצאה עם יישום קצר יותר. אך, אופרטור ה-טרנרי בדוגמה זו תקף רק ב-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 כדי לבדוק.

# עדכון-FileContents.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 כדי לבדוק אם קובץ קיים. זו שיטה טובה לבדוק את קיומו של קובץ לפני לבצע שינויים הקשורים לקובץ.

אתה למדת על שימוש ב- cmdlets Get-Item, Get-ChildItem, ו- Test-Path. וגם על השיטה [System.IO.File]::Exists() .NET. הדוגמאות הראו לך כיצד להשתמש בטכניקות וכיצד לשלב אותן עם לוגיקת טיפול בשגיאות.

תפסיק לסבול מהודעות שגיאה אלו. נצח אותן על ידי הוספת קוד לבדיקה אם קובץ קיים לפני כל פעולה הקשורה לקובץ. הטכניקות שלמדת כאן מכסות רק את היסודות, וכעת זה עליך לשדרג אותן.

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