Проверка версий 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 существует концепция, известная как хосты. Хост – это программа, которая хостит среду выполнения PowerShell. Это не сам движок PowerShell. Консоль PowerShell или редактор кода с интегрированным терминалом – это хосты 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, вы увидите, что он возвращает номер версии, который выглядит так, будто это может быть версией движка 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/