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

2633

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

MagicAndi
источник

Ответы:

3586

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

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

PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      -1     -1
user156862
источник
2
@DanielCassidy - два года с опозданием на вечеринку, но «некоторые функции, по общему мнению, недоступны», могут быть вызваны только тем, что вместо полной версии установлена ​​платформа .Net 3.5 Compact.
Дейв Нили,
83
$PSVersionTableболее надежен и возвращает $ PSVersion. Вы также можете использовать $PSVersionTable.PSVersion. Даже если вы подключены удаленно к машине с другой версией ( invoke-command -computername myRemotePC -Credential foo {$host}), похоже $host, просто покажет самую низкую версию, которую они согласовали для сериализации. Пока $PSVersionTableпокажу верную версию. Надеюсь, это поможет кому-то ..
Вулкан Ворон
16
Кажется, $ host.Version - не лучший выбор ... Если вы подключаетесь к машине, на которой работает PowerShell 3, вы возвращаетесь к версии 1.0, так как RemotingHost выглядит как v1. Использование $ PSVersionTable корректно возвращает 3.
Дэнни Таппени
25
@Starfish Показанная команда запускает Powershell с помощью командной строки. Разве команда не выдаст ошибку «powershell not found», если она не установлена?
jpmc26
9
Настолько устал возвращаться сюда для этого, что я просто побежал notepad $profileи бросил function psver { $PSVersionTable; $PSVersionTable.PSVersion }в нем. Перезагрузите, . $profileи я могу просто напечатать в psverлюбое время, чтобы получить подробную информацию о версии и другие детали.
ADTC
434

Я бы использовал 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
Томас Братт
источник
5
благодарю вас! NB: На моем XP, где я вручную обновился с v1 Powershell, фактические пути к папкам и реестрам (обманчиво ?!) ссылаются на v1, а не на v2. Это, как указывают другие, но именно поэтому я так волновался, установил ли я его. Мой путь есть; C: \ WINDOWS \ system32 \ windowspowershell \ v1.0
AnneTheAgile
4
Если $ psversiontable не существует, можно с полной уверенностью предположить, что вы используете v1.0 - и, привет, это также отвечает на ваш вопрос. $host.versionне является надежным - например, в PowerGUI, он возвращает версию хоста PowerGUI, которая не совпадает с версией двигателя
PowerShell
10
Принятый ответ гласит: «... $ Host.Version и (Get-Host) .Version ненадежны - они отражают только версию хоста, а не движка» .
Питер Мортенсен,
100

Вы можете посмотреть на встроенную переменную $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    
Энди Шнайдер
источник
97

Чтобы определить, установлен ли 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"}
}
MagicAndi
источник
4
Полезно, потому что на сервере Windows 2003 я не смог найти пункт меню «Пуск» для PowerShell (он был там, но не очевиден), но ключ реестра ответил на мой вопрос.
Целостный разработчик
7
В PowerScript 3.0 появилась новая запись, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 (в дополнение к HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 ). В данном случае подходящим местом для получения версии является HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 \ PowerShellEngine \ PowerShellVersion (пример значения «3.0»).
Питер Мортенсен
49

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

powershell -Command "$PSVersionTable.PSVersion"

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

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

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

Образ

Патрик Бард
источник
Я получаю эту ужасную ошибку при попытке: «System.Collections.Hashtable.PSVersion: термин« System.Collections.Hashtable.PSVersion »не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте написание имени, или, если путь был включен, проверьте правильность пути и повторите попытку. ". Так что не всегда работает
Gonmator
Я рад, что вы отметили это, так как хорошо знать угловые случаи, но я думаю, что это все еще работает для большинства людей.
Патрик Бард
@ Гонматор, можно подумать, что PowerShell будет вести себя так же с этой командой, но, к сожалению, это не так. Я сделал попытку исправить синтаксис, чтобы работать между ними безрезультатно cmdи powershellбезрезультатно. Я бы тоже ожидал такого же поведения. :)
tresf
3
@tresf (и @Gonmator) вы МОЖЕТЕ выполнить это независимо от CMD, PowerShell или даже Pwsh (PS 6.0), но вам нужно использовать эту форму: powershell -command "(Get-Variable PSVersionTable -ValueOnly) .PSVersion" (это будет работа во всех случаях)
PSaul
Проверено на Mac тоже. pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" работает отлично.
Tresf
38

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

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

    Get-Host | Select-Object Version

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

Version
-------
3.0

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

Затмения
источник
1
Вы предполагаете, что powershell был установлен с параметрами по умолчанию и что ярлыки не были удалены из меню «Пуск». Лучше использовать тест реестра.
Ксалори
Я думаю, что если вам нужно сначала использовать PowerShell, попробуйте запустить его как стандартный, он должен быть установлен, затем, если вы не найдете значок, вы пытаетесь найти его, то, возможно, вы попытаетесь запустить его из командной строки. Я не думаю, что вы начинаете с реестра.
Затмения
6
Принятый ответ гласит: «... $ Host.Version и (Get-Host) .Version ненадежны - они отражают только версию хоста, а не движка» .
Питер Мортенсен,
21

Рекомендуемый 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>
морская звезда
источник
5
Для PowerShell 3.0, по-видимому, появился новый, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 .
Питер Мортенсен
11

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

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

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 .

SharpC
источник
3
Как и для принятого ответа, это ничего не возвращает для PowerShell 1.0. Метод реестра более явный.
Питер Мортенсен
4
Если PowerShell не было в пути, эта версия создаст ложное впечатление, что она не установлена. Реестр метод дает полную информацию. Наличие и версия.
Ксалори
9

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

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

x0n
источник
9

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

$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 .

Дейл Чен
источник
8

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

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

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

Роман Покровский
источник
8
Который такой же как$PSVersionTable
orad
6
Ищете версию PS? введите $ PSVersion [tab] [enter]. Выполнено. Не нужно ничего вспоминать :)
orad
1
это действительно полезно только в том случае, если вы хорошо знакомы с используемыми хитростями. Новичок никак не сможет запомнить, что весь этот синтаксис проще, чем просто запоминание таблицы $ PSVersionTable
Джозеф Габриэль,
1
Ребята, Get-Variable хорошо работает в одиночку (если все, что вам нужно, просто чтобы получить версию), пайпинг там - просто шутка :) Я тоже не помню синтаксиса пайпинга.
Роман Покровский
7

Чтобы проверить, установлен ли 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

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

Даниэль Эллиотт
источник
7

Так как самый полезный ответ не касался части « если существует» , я подумал, что можно дать один ответ на это через быстрое и грязное решение. Он полагается на то, что 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
Пекос Билл
источник
4

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

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

if ($PSVersionTable.PSVersion.Major -eq 5) {
    #Execute code available in PowerShell 5, like Compress
    Write-Host "You are running PowerShell version 5"
}
else {
    #Use a different process
    Write-Host "This is version $PSVersionTable.PSVersion.Major"
}
Атрон Сейдж
источник
3

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

$PSVersionTable.PSVersion.Major
Venkatakrishnan
источник
2
$PSVersionTableявляется автоматической переменной; объект. Это не командлет.
Максимилиан Бурсли
1

Это лучший результат поиска для «Пакетный файл получить версию 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
)
Дерпи
источник
0

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

Тайлор Дурден
источник
3
Это почти неправильно. hostрешает до Get-Host. Несмотря на это, это не надежный способ получить версию.
Максимилиан Бурслей
-1

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

Get-Host | select {$_.Version}
Habo
источник
7
Принятый ответ гласит: «... $ Host.Version и (Get-Host) .Version ненадежны - они отражают только версию хоста, а не движка» .
Питер Мортенсен
@PeterMortensen выглядит так, как будто мой ответ был до того, как он был принят
HaBo
2
@HaBo На что ты смотришь? Принятый ответ с 2009 года.
TylerH
@TylerH и что? Я не слежу за вашим вопросом. мой ответ ясно говорит, что это расширение принятого ответа. это упрощенная версия.
HaBo
2
@HaBo Ваш предыдущий комментарий гласит, что вы оправдываете свой ответ тем, что он был опубликован до принятого ответа, что совсем не так. Ваш ответ был опубликован через 7 лет после принятого ответа и через 6 лет после ответа ваш фактически «расширяется»; говоря о том, что ваш ответ не ясно говорит, что это расширение принятого ответа (который даже не используется Get-Host).
TylerH