PowerShell פקודת הבדיקה-נתיב: אימות קבצים, מפתחות, ועוד

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

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

במדריך זה, אתה הולך ללמוד את כל מה שצריך לדעת על פקודת ה־Test-Path של PowerShell וכיצד ניתן להשתמש בה כדי לשפר את סקריפטי ה־PowerShell שלך.

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

אם תרצה להמשיך לעקוב אחר הדוגמאות במדריך זה, תצטרך משהו אחד; PowerShell. יותר מספיק, המדריך יעשה שימוש ב־PowerShell v7.03 ב־Windows 10, אף על פי שרב מהטכניקות שתלמד יחולו גם לגרסאות ישנות יותר.

מה עושה פקודת ה־Test-Path?

פקודת ה־Test-Path של PowerShell היא אחת הפקודות הפשוטות ביותר. זו פקודה שקיימת ב־PowerShell מההתחלה ומחזירה רק שני ערכים; True או False.

אך, אל תתפתה על ידי הפשטות; זה יחסוך לך כל כך הרבה זמן באימות מידע בסקריפטים שלך ב־PowerShell.

תחשוב על פקודת ה־Test-Path ב־PowerShell כמו בקרת איכות כאשר אתה עובד עם ספקי PowerShell ושוניות. בעת כתיבת סקריפט, כמעט תמיד תעבוד עם פריטים שונים הנמצאים בשוניות של PowerShell. שוניות ב־PowerShell כמו C:\, HKLM, Cert, וכו'

Test-Path לא עובדת עם כל השוניות של PowerShell. לדוגמה, אם תנסה להשתמש ב־Test-Path נגד מפתח רישום, זה יעבוד. אם תנסה להשתמש ב־Test-Path נגד ערך רישום, זה יחזיר False בכל פעם.

אם אתה סקרני, הרץ את פקודת ה־Get-PSDrive כרגע ב־PowerShell ושים לב לכל השוניות של PowerShell שמופיעות לך.

PS Drives after running Get-PSDrive

לכל השוניות הללו יש נתיבים בתוכם כמו C:\Windows, HKLM:\Software, וכו'. כאשר אתה עובד עם נתיבים בתוך הסקריפטים שלך ב־PowerShell, תמיד כדאי לבדוק תחילה האם הנתיב חוקי או שהוא קיים או לא. זהו מה ש־Test-Path של PowerShell עושה.

Test-Path מגדיר תנאי שמחזיר True או False בהתאם לאם תנאי מסוים נפגש (בדרך כלל האם קובץ/תיקייה, מפתח רישום, תעודה, או אפילו משתנה קיים או לא).

פרמטרים ושימוש ב־Test-Path

אומרים שונים PowerShell, ה-\code{Test-Path} cmdlet כמו הרבה cmdlets אחרים, יש לו מספר פרמטרים שונים שיכולים לשנות את ההתנהגותו. בואו נכסה כל פרמטר בנפרד ונדגים איך הוא עובד ואילו תוצאות תוכל לצפות לראות.

Path

הפרמטר \code{Path} הוא פרמטר חובה שתשתמש בו בכל הרצת \code{Test-Path}. הפרמטר \code{Path} מגדיר את הנתיב של PSDrive שברצונך לבדוק אם קיים או לא.

לדוג, אם ברצונך לבדוק האם התיקייה C:\Foo קיימת או לא, יש לספק את הנתיב המתאים לפרמטר \code{Path}. אז, בהתאם לכך אם C:\Foo קיימת או לא, \code{Test-Path} יחזיר או \code{True} או \code{False}.

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

הטכניקה הזו יכולה להיעשות גם על ידי נתיבים של פריטים אחרים. אולי ברצונך לבדוק האם מפתח הרשומה HKLM:\Software\Foo קיים. בפשטות, יש להשתמש בנתיב מפתח הרשומה עם הפרמטר \code{Path}.

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

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

שימוש ב-Wildcards

מה קורה אם אין לך בדיוק איפה למצוא את הערך המדויק שאתה מחפש. במקום זאת, רוצה פשוט לבדוק אם יש נתיב התואם לתבנית מסוימת. במקרה כזה, ניתן להשתמש ב-wildcards בערך של \code{Path}.

אולי ברצונך לבדוק האם התיקייה C:\Foo מכילה תת-תיקיות שמתחילות ב-\diy15>Bar. במקרה כזה, ניתן להשתמש ב-wildcard.

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

פעם שתבצעו את הפקודה לעיל, Test-Path תבדוק אם קיימת תיקייה שמתחילה בשם כלשהו ותחזיר 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 היא להשתמש בערך 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 וכרטיסי wildcards, לעיתים תצטרך להיות יותר ספציפי. במקרה כזה, עליך להתייחס לפרמטרים 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 צריך להיות בשימוש עם cmdlets אחרים כמו 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, לא כקומנדלט שבודק קיומו של פריט אלא כקומנדלט שבודק את תחביר הנתיב. הפרמטר מאשר האם נתיב הוא תקף רק.

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

כאשר אתה מחבר נתיבים, תמיד עדיף להשתמש בפקודת 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 ב- Test-Path, ייתכן שתחשוב שניתן להשתמש בו לאימות במנועי PS כמשתמש אחר. זו הנחה תקפה, אך זו טעות.

לצערנו, הפרמטר Credential לא עושה הרבה עם פקודת Test-Path. מיקרוסופט ממליצה להשתמש בפקודת Invoke-Command ולהשתמש בפרמטר Credential שם אם ברצונך להפעיל את Test-Path עם הרשאות נוספות.

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

קשור: Invoke-Command: הדרך הטובה ביותר להריץ קוד מרחוק

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