Определить установленную версию PowerShell

Как определить, какая версия PowerShell установлена ​​на компьютере и действительно ли она установлена?

32 ответа

Решение

Использование $PSVersionTable.PSVersion определить версию двигателя. Если переменная не существует, можно с уверенностью предположить, что двигатель является версией 1.0,

Обратите внимание, что $Host.Version а также (Get-Host).Version не являются надежными - они отражают только версию хоста, а не двигателя. PowerGUI, PowerShellPLUS и т. Д. Являются хост-приложениями, и они устанавливают версию хоста для отображения версии своего продукта - что совершенно правильно, но не то, что вы ищете.

PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      -1     -1

Я бы использовал либо Get-Host, либо $ PSVersionTable. Как указывает Энди Шнайдер, $PSVersionTable не работает в версии 1; это было введено в версии 2.

get-host

Name             : ConsoleHost
Version          : 2.0
InstanceId       : d730016e-2875-4b57-9cd6-d32c8b71e18a
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : en-GB
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

$PSVersionTable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.4200
BuildVersion                   6.0.6002.18111
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1

Вы можете посмотреть на встроенную переменную, $psversiontable, Если он не существует, у вас есть V1. Если он существует, он предоставит вам всю необходимую информацию.

1 >  $psversiontable

Name                           Value                                           
----                           -----                                           
CLRVersion                     2.0.50727.4927                                  
BuildVersion                   6.1.7600.16385                                  
PSVersion                      2.0                                             
WSManStackVersion              2.0                                             
PSCompatibleVersions           {1.0, 2.0}                                      
SerializationVersion           1.1.0.1                                         
PSRemotingProtocolVersion      2.1    

Чтобы определить, установлен ли PowerShell, вы можете проверить реестр на наличие

HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install

а также

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3

и, если он существует, является ли значение 1 (для установленного), как подробно описано в сообщении в блоге Проверьте, установлен ли PowerShell и версия.

Чтобы определить версию PowerShell, которая установлена, вы можете проверить разделы реестра

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion

а также

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

Чтобы определить версию PowerShell, установленную из сценария.ps1, вы можете использовать следующую однострочную версию, как подробно описано на PowerShell.com, в которой версия PowerShell запущена.

$isV2 = test-path variable:\psversiontable

На этом же сайте также есть функция для возврата версии:

function Get-PSVersion {
    if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}

Просто хочу добавить мои 2 цента здесь.

Вы можете напрямую проверить версию одной строкой, только вызвав powershell извне, например из командной строки

powershell -Command "$PSVersionTable.PSVersion"

РЕДАКТИРОВАТЬ:

Согласно @psaul, у вас может быть одна независимая команда, откуда она пришла (CMD, Powershell или Pwsh), спасибо за это.

powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" 

Я протестировал, и он работал безупречно как на CMD, так и на Powershell

образ

Вы можете проверить, установлена ​​ли версия Windows PowerShell, выполнив следующую проверку:

  1. Нажмите "Пуск", выберите "Все программы", "Стандартные", "Windows PowerShell" и "Windows PowerShell".
  2. В консоли Windows PowerShell введите следующую команду в командной строке и нажмите клавишу ВВОД:

    Get-Host | Версия Select-Object

Вы увидите вывод, который выглядит следующим образом:

Version
-------
3.0

http://www.myerrorsandmysolutions.com/how-to-verify-the-windows-powershell-version-installed/

Рекомендуемый Microsoft метод прямой совместимости для проверки, установлен ли PowerShell и определения установленной версии, заключается в рассмотрении двух конкретных разделов реестра. Я воспроизвел подробности здесь на случай разрыва связи.

Согласно связанной странице:

В зависимости от любого другого раздела (ов) реестра или версии PowerShell.exe или расположения PowerShell.exe не гарантируется долгосрочная работа.

Чтобы проверить, установлена ​​ли какая-либо версия PowerShell, проверьте следующее значение в реестре:

  • Ключевое местоположение: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
  • Имя значения: Установить
  • Тип значения: REG_DWORD
  • Данные значения: 0x00000001 (1

Чтобы проверить, установлена ли версия 1.0 или 2.0 PowerShell, проверьте следующее значение в реестре:

  • Ключевое местоположение: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
  • Имя значения: PowerShellVersion
  • Тип значения: REG_SZ
  • Значение данных: <1.0 | 2,0>

PowerShell 7

Принятый ответ подходит только в том случае, если на компьютере установлена ​​одна версия PowerShell. С появлением PowerShell 7 такой сценарий становится все менее вероятным.

В документации Microsoft указано, что при установке PowerShell 7 создаются дополнительные ключи реестра:

Начиная с PowerShell 7.1, пакет [installer] создает разделы реестра, в которых хранятся место установки и версия PowerShell. Эти значения расположены в HKLM\Software\Microsoft\PowerShellCore\InstalledVersions\<GUID>. Значение <GUID> уникален для каждого типа сборки (выпуск или предварительная версия), основной версии и архитектуры.

Это означает, что путь к реестру в некоторой степени изменится. Несмотря на это, ключевой частью информации, которую мы ищем, являются данные, содержащиеся в значении реестра, называемом SemanticVersion. На моем компьютере это выглядит так:

      Path                                                                                           Name              Type Data
----                                                                                           ----              ---- ----
HKLM:\SOFTWARE\Microsoft\PowerShellCore\InstalledVersions\31ab5147-9a97-4452-8443-d9709f0516e1 SemanticVersion String 7.1.3

Как видите, на моем компьютере установлена ​​версия PowerShell 7 7.1.3. Если PowerShell 7 не установлен на целевом компьютере, весь ключ не должен существовать.

Частичное изменение ключевого пути может представлять проблему в некоторых сценариях, но сама PowerShell может легко справиться с этой проблемой.

Для тех, кто заинтересован, командлет PowerShell, используемый для запроса данных в этом значении реестра, - это командлет Get-ItemPropertyValue . Обратите внимание на его использование и вывод (обратите внимание на подстановочный знак звездочки, используемый вместо части ключевого пути, которая может измениться):

      PS 7.1.3> Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\PowerShellCore\InstalledVersions\*" -Name "SemanticVersion"

7.1.3

Я нашел самый простой способ проверить, установлен ли он:

  • запустить командную строку (Пуск, Выполнить, cmd, тогда хорошо)
  • тип powershell затем нажмите кнопку возврата. Затем вы должны получить PowerShell PS незамедлительный:

C:\Users\MyUser>powershell

Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\Users\MyUser>

Затем вы можете проверить версию в командной строке PowerShell, набрав $PSVersionTable.PSVersion:

PS C:\Users\MyUser> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1

PS C:\Users\MyUser>

Тип exit если вы хотите вернуться в командную строку (exit еще раз, если вы хотите также закрыть командную строку).

Чтобы запустить сценарии, см. http://ss64.com/ps/syntax-run.html.

Самый простой способ забыть эту страницу и никогда не возвращаться к ней - это изучить Get-Variable:

Get-Variable | where {$_.Name -Like '*version*'} | %{$_[0].Value}

Нет необходимости запоминать каждую переменную. Просто Get-Variable достаточно (и "Там должно быть что-то о версии").

Использование:

$psVersion = $PSVersionTable.PSVersion
If ($psVersion)
{
    #PowerShell Version Mapping
    $psVersionMappings = @()
    $psVersionMappings += New-Object PSObject -Property @{Name='5.1.14393.0';FriendlyName='Windows PowerShell 5.1 Preview';ApplicableOS='Windows 10 Anniversary Update'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.1.14300.1000';FriendlyName='Windows PowerShell 5.1 Preview';ApplicableOS='Windows Server 2016 Technical Preview 5'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.494';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3172985 1607'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.122';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3140743 1603'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.117';FriendlyName='Windows PowerShell 5 RTM 1602';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.63';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3135173 1602'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.51';FriendlyName='Windows PowerShell 5 RTM 1512';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10514.6';FriendlyName='Windows PowerShell 5 Production Preview 1508';ApplicableOS='Windows Server 2012 R2'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10018.0';FriendlyName='Windows PowerShell 5 Preview 1502';ApplicableOS='Windows Server 2012 R2'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.9883.0';FriendlyName='Windows PowerShell 5 Preview November 2014';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows 8.1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='4.0';FriendlyName='Windows PowerShell 4 RTM';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='3.0';FriendlyName='Windows PowerShell 3 RTM';ApplicableOS='Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8, and Windows 7 SP1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='2.0';FriendlyName='Windows PowerShell 2 RTM';ApplicableOS='Windows Server 2008 R2 SP1 and Windows 7'}
    foreach ($psVersionMapping in $psVersionMappings)
    {
        If ($psVersion -ge $psVersionMapping.Name) {
            @{CurrentVersion=$psVersion;FriendlyName=$psVersionMapping.FriendlyName;ApplicableOS=$psVersionMapping.ApplicableOS}
            Break
        }
    }
}
Else{
    @{CurrentVersion='1.0';FriendlyName='Windows PowerShell 1 RTM';ApplicableOS='Windows Server 2008, Windows Server 2003, Windows Vista, Windows XP'}
}

Вы можете скачать подробный скрипт из Как определить установленную версию PowerShell.

$host.version это просто неправильно / ненадежно. Это дает вам версию исполняемого файла хостинга (powershell.exe, powergui.exe, powershell_ise.exe, powershellplus.exe и т. Д.), А не версию самого движка.

Версия двигателя содержится в $psversiontable.psversion, Для PowerShell 1.0 эта переменная не существует, поэтому, очевидно, что если эта переменная недоступна, вполне можно предположить, что движок равен 1.0.

Так как самый полезный ответ не касался части " если существует", я подумал, что можно дать один ответ на это через быстрое и грязное решение. Он полагается на то, что PowerShell находится в переменной окружения пути, что, скорее всего, то, что вам нужно. (Шляпа к верхнему ответу, так как я этого не знал.) Вставьте это в текстовый файл и назовите его

Тест Powershell Version.cmd

или похожие.

@echo off
echo Checking powershell version...
del "%temp%\PSVers.txt" 2>nul
powershell -command "[string]$PSVersionTable.PSVersion.Major +'.'+ [string]$PSVersionTable.PSVersion.Minor | Out-File ([string](cat env:\temp) + '\PSVers.txt')" 2>nul
if errorlevel 1 (
 echo Powershell is not installed. Please install it from download.Microsoft.com; thanks.
) else (
 echo You have installed Powershell version:
 type "%temp%\PSVers.txt"
 del "%temp%\PSVers.txt" 2>nul
)
timeout 15

Чтобы проверить, установлен ли PowerShell, используйте:

HKLM\Software\Microsoft\PowerShell\1 Install ( = 1 )

Чтобы проверить, установлен ли RC2 или RTM, используйте:

HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-00301) -- For RC2
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-04309) -- For RTM

Источник: этот сайт.

Мне нужно было проверить версию PS, а затем запустить соответствующий код. Некоторые из наших серверов работают под управлением v5, другие v4. Это означает, что некоторые функции, такие как сжатие, могут быть или не быть доступными.

Это мое решение:

if ($PSVersionTable.PSVersion.Major -eq 5) {
    #Execute code available in 5, like Compress
    Write-Host "You are running version 5"
}
else {
    #Use a different process
    Write-Host "This is version $PSVersionTable.PSVersion.Major"
}

Приведенный ниже командлет вернет версию PowerShell.

$PSVersionTable.PSVersion.Major

Это лучший результат поиска для "Пакетный файл получить версию PowerShell", поэтому я хотел бы привести базовый пример того, как выполнить условный поток в пакетном файле в зависимости от версии PowerShell.

общий пример

powershell "exit $PSVersionTable.PSVersion.Major"
if %errorlevel% GEQ 5 (
    echo Do some fancy stuff that only powershell v5 or higher supports
) else (
    echo Functionality not support by current powershell version.
)

пример из реального мира

powershell "exit $PSVersionTable.PSVersion.Major"
if %errorlevel% GEQ 5 (
    rem Unzip archive automatically
    powershell Expand-Archive Compressed.zip
) else (
    rem Make the user unzip, because lazy
    echo Please unzip Compressed.zip prior to continuing...
    pause
)

Вы также можете вызвать команду "host" из командной строки PowerShell. Это должно дать вам значение $host переменная.

Я пробовал это на version 7.1.0 и это сработало:

      $PSVersionTable | Select-Object PSVersion

Выход

      PSVersion
---------
7.1.0

Это не работает на version 5.1 хотя, лучше сделайте это в версиях ниже 7:

      $PSVersionTable.PSVersion

Выход

      Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      18362  1171

Обычно вы получаете его, используя основной номер, который вы можете получить так:

$PSVersionTable.PSVersion.Major

Расширение ответа с помощью оператора выбора:

Get-Host | select {$_.Version}

Я использовал следующее, которое работает на PS 7 и PS 5:

      $psver = $PSVersionTable.PSVersion.Major

или:

      $psver = (Get-Host).Version.Major

Тогда я могу использовать логику в зависимости от того, какая версия работает.

      $PSVer = (Get-Host).Version.Major
$sortSwitch = "-Descending"
if ($PSVer -gt 5) {$sortSwitch = "-r"}
$pathSep = [IO.Path]::DirectorySeparatorChar

$pattern = "???? something.zip"
$files = (Get-ChildItem $pattern -Name | sort $sortSwitch)
foreach ($file in $files) {
    # Do stuff
}

Попробуйте это с помощью следующей команды:

Get-Host

Видела здесь

Очень старый вопрос, но все еще актуальный, просто сейчас в 2023 году природа проблемы другая. Найти версию несложно, но сначала надо запустить нужный экзешник. Для этого мы в основном вернулись к поиску в реестре.

      reg query "HKLM\SOFTWARE\Microsoft\PowerShell\1" /v Install >nul 2>&1
if %ERRORLEVEL% EQU 0 (
  :: Default to PowerShell 5 if both are installed
  set PSEXE=powershell
) else (
  set PSEXE=pwsh
)
echo Using %PSEXE%
%PSEXE% -ExecutionPolicy bypass -command "& { ... ; exit $LASTEXITCODE }"

Есть и другие подсказки, которые вы можете получить, проверив переменные среды, но я думаю, что тестирование реестра для Windows PowerShell является самым безопасным.

Используйте команду Get-Host. Вторая строка результата - версия.

Пытаться;)((Get-Host).Version).Major

Получить версию PowerShell от $host.Version команда.

выход:

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

Я сделал небольшой пакетный скрипт, который может определить версию PowerShell:

@echo off
for /f "tokens=2 delims=:" %%a in ('powershell -Command Get-Host ^| findstr /c:Version') do (echo %%a)

Это просто извлекает версию PowerShell, используя Get-Host и ищет строку Version

Когда строка с версией найдена, она использует forкоманда для извлечения версии. В этом случае мы говорим, что разделителем является двоеточие, и ищем следующее первое двоеточие, что приводит к моему случаю5.1.18362.752.

# Get PowerShell Version
function Global:version
{
      $PSVersionTable.PSVersion
}

Команда $PSVersionTable.PSVersion полезно

Major  Minor  Patch  PreReleaseLabel BuildLabel
-----  -----  -----  --------------- ----------
6      1      0
Другие вопросы по тегам