בדוק גרסאות של PowerShell: שיטות מומלצות

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

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

כל הדרכים אמורות לעבוד גם ב-Windows PowerShell וגם ב-PowerShell Core. השיטות הללו אמורות גם לעבוד בגרסאות שונות של Windows PowerShell מגרסא 1.0 ועד PowerShell 7.

הדרכים לזיהוי גרסה של PowerShell הן:

  1. מאפיין (Get-Host).Version
  2. מאפיין $host.Version
  3. הרשומות (רק ב-Windows PowerShell)
  4. מאפיין $PSVersionTable.PSVersion

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

Get-Host

יש ב-PowerShell ייצוג הידע כמו hosts. Host הוא תוכנית שתומכת במנוע PowerShell. זה לא המנוע של PowerShell עצמו. מסוף PowerShell או עורך קוד עם טרמינל משולב הם hosts של PowerShell.

A host can have a version that is completely independent of PowerShell itself. This can be deceiving to many newcomers. Let me show you why.

אם תריצו את (Get-Host).Version, תראו שהוא מחזיר מספר גרסה שנראה כאילו זה יכול להיות גרסת מנוע הפוורשל. המראה יכול להיות מטעה.

מתחת לרץ Get-Host ב- Windows PowerShell 5.1 ואתה יכול לראות שהוא חוזר עם 5.1.17134.858. זה נראה כמו גרסה תקינה.

PS51> (Get-Host).Version
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

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

בדיקת גרסת פוורשל דרך Get-Host על מחשבים מרוחקים

אף על פי ש־Get-Host נראה כי הוא מחזיר את אותה הגרסה כאשר מורץ על מחשב מקומי, זה לעולם לא יקרה על מחשבים מרוחקים.

לדוגמה, בואו נריץ Get-Host על שרת Windows Server 2016 מרוחק באמצעות Invoke-Command ונראה מה קורה.

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {Get-Host} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

בפעם האחרונה שבדקתי, אי אפשר להריץ PowerShell v1 על Windows Server 2016.

לסמוך על Get-Host הוא רעיון רע בכל היבט.

בדיקת גרסת פוורשל באמצעות הפקודה $host.Version

הפניה ל־$host.Version היא דרך נוספת לבדוק גרסת פוורשל. משתנה ה־$host הוא משתנה אוטומטי שמחזיר את אותה הפלט כמו Get-Host.

Referencing $host.Version

אין כלום מיוחד בשיטה זו. פשוט זהה להרצת Get-Host.

$host.Version במחשבים מרוחקים

תראו את אותה ההתנהגות גם דרך PowerShell Remoting עם $host.Version כפי שתראו בהרצת Get-Host.

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$host.Version} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

סכנה, רובינסון!

רישומים

אם אינכם רוצים לפתוח את PowerShell עצמו, תוכלו גם לבדוק את הרישום. גרסת PowerShell מאוחסנת בתוך ערך במפתח הרישום בנתיב HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine. מפתח הרישום הזה מכיל ערך בשם PowerShellVersion שתוכלו להתייחס אליו באמצעות Get-ItemProperty.

PS51> (Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
5.1.17134.1

תראו שהגרסה הזו דומה, אך אינה כוללת את התיקון כמו האפשרויות האחרות.

PS51> [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  1

שימוש בכלים אחרים

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

CMD> reg query HKLM\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine /v PowerShellVersion

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine
    PowerShellVersion    REG_SZ    5.1.17134.1

רישום במחשבים מרוחקים

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

PS51> $scriptBlock = {
    [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
}
PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock $scriptBlock -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  1        10.0.0.5

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

בדיקת גרסת PowerShell באמצעות פקודת $PSVersionTable.PSVersion

השיטה האחרונה והסופית היא להתייחס למאפיין PSVersion במשתנה האוטומטי $PSVersionTable. שיטה זו תמיד תייצג את מנוע הפוורשל.

PS51> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

המשתנה האוטומטי $PSVersionTable הוא טבלת גיבוי לקריאה שמחזירה מידע ספציפית על גרסת מנוע הפוורשל. משתנה זה לא יחזיר רק את הגרסה, אלא גם את PSEdition. מאפיין זה יכול להיות או Core או Desktop לספק מידע נוסף אודות המהדורה של פוורשל הפועלת.

$PSVersionTable output

$PSVersionTable במחשבים מרוחקים

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

PS> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$PSVersionTable.PSVersion} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  592      10.0.0.5

סיכום

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

I recommend always using $PSVersionTable.PSVersion. All of the other methods may appear similar to the PowerShell engine version but may not always reflect the engine version.

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

Source:
https://adamtheautomator.com/powershell-version/