تحقق من إصدارات 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 أو محرر الكود مع وحدة نمطية مدمجة هي hosts.

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، سترى أنه يعيد رقم إصدار يبدو وكأنه يمكن أن يكون إصدار محرك PowerShell. الشكل الخارجي قد يكون مضللاً.

أدناه قمت بتشغيل Get-Host على Windows PowerShell 5.1 ويمكنك رؤية أنه يعود بالإصدار 5.1.17134.858. هذا يبدو كإصدار شرعي.

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

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

التحقق من إصدار Powershell عبر 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 فكرة سيئة بشكل عام.

التحقق من إصدار Powershell بأمر $host.Version

الإشارة إلى $host.Version هي طريقة أخرى للتحقق من إصدار Powershell. المتغير $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

استخدام أدوات أخرى

يعني استخدام التسجيل أيضًا أنه لا يلزم استخدام PowerShell على الإطلاق للعثور على الإصدار. يمكنك تشغيل الأوامر من سطر الأوامر أو أداة أخرى يمكنها قراءة التسجيل.

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. ستمثل هذه الطريقة دائمًا محرك PowerShell.

PS51> $PSVersionTable.PSVersion

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

المتغير التلقائي $PSVersionTable هو جدول تجزئة للقراءة فقط يعيد معلومات بشكل خاص حول إصدار محرك PowerShell. هذا المتغير التلقائي لا يعيد فقط الإصدار ولكن أيضًا PSEdition. يمكن أن يكون هذا الخاصية إما Core أو Desktop لتوفير معلومات إضافية حول نسخة PowerShell التي تعمل.

$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

ملخص

في هذه المقالة في المدونة، لقد تعلمت جميع الطرق للتحقق من إصدار PowerShell محليًا وعن بعد. آمل أن تعطيك الطرق الأولى فكرة عن الطرق التي لا يجب التحقق من الإصدار بها!

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/