אם תרצה לאמת נתיב לקובץ, מפתח רישום, אישור או כל נתיב של דרייב 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 שמופיעות לך.

לכל השוניות הללו יש נתיבים בתוכם כמו 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}.
הטכניקה הזו יכולה להיעשות גם על ידי נתיבים של פריטים אחרים. אולי ברצונך לבדוק האם מפתח הרשומה HKLM:\Software\Foo קיים. בפשטות, יש להשתמש בנתיב מפתח הרשומה עם הפרמטר \code{Path}.
שימו לב שכל הטכניקות שנדגמו במהלך המדריך הזה יעבדו גם עם נתיבי דיסק אחרים של PowerShell.
שימוש ב-Wildcards
מה קורה אם אין לך בדיוק איפה למצוא את הערך המדויק שאתה מחפש. במקום זאת, רוצה פשוט לבדוק אם יש נתיב התואם לתבנית מסוימת. במקרה כזה, ניתן להשתמש ב-wildcards בערך של \code{Path}.
אולי ברצונך לבדוק האם התיקייה C:\Foo מכילה תת-תיקיות שמתחילות ב-\diy15>Bar. במקרה כזה, ניתן להשתמש ב-wildcard.
פעם שתבצעו את הפקודה לעיל, Test-Path
תבדוק אם קיימת תיקייה שמתחילה בשם כלשהו ותחזיר True
או False
בהתאם לכך האם קיימת תיקייה התואמת לקריטריונים אלה או לא.
כוכביות (*
) מתאימות לתו אחד או יותר אך ניתן גם להשתמש בסימני שאלה (?
) כדי להיות יותר פינויים ולבדוק עבור תו יחיד.
על פי הדוגמה לעיל, אם התיקייה C:\Foo\Bar1 קיימת, ניתן לבדוק עבור כל תיקייה משנית של Foo שמתחילה בשם Bar והיא בדיוק באורך ארבעה תווים באמצעות הפקודה למטה.
אם, מסיבה מסוימה, ברצונך להשתמש בפרמטר
Path
עם תווי כלליות אך לרצות להתאים ממש את תו הכלליות כמו*
, תמיד ניתן להשתמש באמצעות סימן הקרש (`
).
LiteralPath
הפרמטר LiteralPath
דומה בצורה כמעט מוחלטת לפרמטר Path
עם יוצא מן הכלל; יש לו הבדל אחד, הוא לא מקבל תווי כלליות. שימוש ב- LiteralPath
יפעל את הערך של הנתיב במדויק כפי שהוא.
לדוגמה, אם תנסה להשתמש בכוכבית או סימן השאלה בתוך ערך הנתיב באמצעות LiteralPath
, Test-Path
תתעלם לחלוטין מתווי הכלליות ותבדוק את הנתיב באופן ממשי ל C:\Foo\Bar? כמו בדוגמה למטה.
יש להשתמש ב-
LiteralPath
כפרמטר הנתיב ברירת המחדל אם אין צורך להשתמש בתווי כלליות כדי לוודא ש-Test-Path
בודק את הנתיב שציפית לו.
PathType
במצב ברירת המחדל, כאשר אתה מפעיל את Test-Path
ומספק לו נתיב, הוא יחזיר True
אם הוא מוצא משהו בנתיב ההוא. הפריט עם נתיב יכול להיות מחזיק כמו תיקיית קובץ, מפתח רשומות, אחסון תעודות, וכו ', או עלה כמו קובץ, ערך רשומות, או תעודה.
ניתן לכפות על Test-Path
להיות יותר פירוטי ולבדוק באופן מפורש לפריט מחזיק או עלה באמצעות הפרמטר PathType
.
ברירת המחדל של
Test-Path
היא להשתמש בערךAny
.
לדוגמה, אם יש תיקייה ב- C:\Foo\Bar ואתה מחפש קובץ בנתיב הזה, תוכל להשתמש בפרמטר PathType
כפי שמוצג למטה. ברצונך לבדוק רק אם קובץ בשם C:\Foo\Bar קיים.
אולי במקום זאת, אתה צריך לוודא האם C:\Foo\Bar הוא למעשה קובץ. במקרה כזה, תבדוק עבור מחזיק.
כלול
בשימוש בפרמטר Path
וכרטיסי wildcards, לעיתים תצטרך להיות יותר ספציפי. במקרה כזה, עליך להתייחס לפרמטרים Include
ו־Exclude
.
נניח שיש לך את התיקיות הבאות:
- C:\Foo\Bar1
- C:\Foo\Bar2
- C:\Foo\Bar3
תרצה לבדוק האם קיימת תיקייה המתחילה ב־ Bar המכילה בדיוק ארבע תווים כמו Bar1, Bar2, וכו '.
הפקודה לעיל עובדת כמו שצריך, אך עכשיו ברצונך למצוא רק תיקיות ב- C:\Foo בשם Bar2. במקרה כזה, תוכל להשתמש בפרמטר Include
.
הפקודה לעיל כעת בודקת בסך הכול את התיקייה C:\Foo\Bar2. כנראה שתהליך טוב יותר הוא פשוט להשתמש ב־Test-Path -Path 'C:\Foo\Bar2' -PathType Container
במקום.
התעלם
הפרמטר Exclude
פועל בדיוק באותו אופן כמו הפרמטר Include
, רק שהפעם הוא מייבא נתיבים התואמים למחרוזת.
אולי ברצונך לוודא שיש לפחות קובץ אחד בתוך התיקייה C:\Foo, ותשתמש בפקודה הבאה:
הפקודה לעיל מחזירה True
או False
אם ישנם קבצים בתוך C:\Foo. אולם אולי ברצונך לוודא שישנם קבצים למעט אלה עם סיומת של txt
. במקרה כזה, ניתן להשתמש בפרמטר 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
כמפורט למטה.
OlderThan
הפרמטר OlderThan
זהה לפרמטר NewerThan
אך בהפוך. הפרמטר הזה בודק האם פריט מתאריך מסוים הוא יותר ישן.
IsValid
אם אי פעם בנית דרכים דינמיות בתסריט, תדע את המאמץ. לפעמים תקליד בטעות או תקבל תו מיוחד בדרך; אם כן, הפרמטר IsValid
הוא בשבילך.
הפרמטר IsValid
הוא פרמטר ייחודי שמשנה את Test-Path
, לא כקומנדלט שבודק קיומו של פריט אלא כקומנדלט שבודק את תחביר הנתיב. הפרמטר מאשר האם נתיב הוא תקף רק.
לדוגמה, אולי תצטרך לוודא אם נתיב תקני סינטקטי. אתה עובד עם כמה משתנים ומשתמש בחיבור ביניהם כדי לבנות נתיב.
כאשר אתה מחבר נתיבים, תמיד עדיף להשתמש בפקודת
Join-Path
. זה רק לדוגמה!
כעת, כדי לוודא שהנתיב שיצרת דינמית הוא חוקי, השתמש בפרמטר IsValid
כמו שמוצג למטה. תגלה ש- Test-Path
מחזיר 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
עם הרשאות נוספות.