Визначте встановлену версію PowerShell


2631

Як я можу визначити, яка версія PowerShell встановлена ​​на комп'ютері та чи взагалі вона встановлена?

Відповіді:


3583

Використовуйте $PSVersionTable.PSVersionдля визначення версії двигуна. Якщо змінної не існує, можна припустити, що двигун є версією 1.0.

Зверніть увагу , що $Host.Versionі (Get-Host).Versionне надійні - вони відображають версію хоста тільки, а НЕ двигун. PowerGUI, PowerShellPLUS тощо - всі хостингові програми, і вони встановлять версію хоста так, щоб відображати версію продукту - це цілком правильно, але не те, що ви шукаєте.

PS C:\> $PSVersionTable.PSVersion

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

2
@DanielCassidy - два роки спізнюються на вечірку, але "деякі функції незрозуміло недоступні" може бути викликано лише встановленням .Net 3.5 Compact Framework замість повного.
Дейв Нілі

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.
Danny Tuppeny

25
@Starfish Показана команда запускає Powershell за допомогою командного рядка. Чи не буде команда просто помилитися з "powershell not found", якщо вона не встановлена?
jpmc26

9
Настільки втомився повертатися сюди з-за цього, що я просто побіг notepad $profileі кинувся function psver { $PSVersionTable; $PSVersionTable.PSVersion }в нього. Перезавантажтесь, . $profileі я можу просто ввести psverбудь-який час, щоб отримати детальну інформацію про версію та інші деталі.
ADTC

432

Я б використовував або 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
Дякую тобі! Примітка: На моєму XP, де я вручну оновив з v1 Powershell, фактична довідка до папок та реєстру (вводячи в оману ?!) посилання v1 НЕ v2. Це так, як уточнюють інші, але це було причиною, чому я так хвилювався, чи встановив я його. Мій шлях такий; C: \ WINDOWS \ system32 \ windowspowershell \ v1.0
AnneTheAgile

4
Якщо $ psversiontable не існує, цілком безпечно припустити, що ви перебуваєте на v1.0 - і hey presto, що також відповідає на ваше запитання. $host.versionне є надійним - наприклад, у powergui, він повертає головну версію powergui, яка не є такою ж, як версія двигуна powerhell (що бажано.)
x0n

10
У прийнятій відповіді зазначено "... $ Host.Version і (Get-Host). Версія не є надійною - вони відображають лише версію хоста, а не движок" .
Пітер Мортенсен

99

Ви можете подивитися на вбудованому змінному $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    

96

Щоб визначити, чи встановлено 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"}
}

4
Корисно, тому що на сервері Windows 2003 я не зміг знайти пункт меню пуску для PowerShell (він там був, але не очевидний), але ключ реєстру відповів на моє запитання.
Holistic Developer

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").
Пітер Мортенсен

47

Ви можете безпосередньо перевірити версію одним рядком, лише звернувшись до 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

37

Ви можете перевірити, чи встановлена ​​версія Windows PowerShell, виконавши таку перевірку:

  1. Клацніть Пуск, виберіть Усі програми, виберіть Аксесуари, виберіть Windows PowerShell, а потім Windows PowerShell.
  2. У консолі Windows PowerShell введіть таку команду в командному рядку та натисніть клавішу ENTER:

    Get-Host | Select-Object Version

Ви побачите вихід, який виглядає приблизно так:

Version
-------
3.0

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


1
Ви припускаєте, що посібник було встановлено з параметрами за замовчуванням, і ярлики не були видалені з меню "Пуск". Краще скористатися тестом реєстру.
Xalorous

Я думаю, що якщо вам потрібно скористатися PowerShell спочатку, ви спробуєте запустити його як стандартний, його слід встановити, то якщо ви не знайдете піктограму, спробуйте її пошукати, то, можливо, ви спробуєте запустити її з командного рядка. Я не думаю, що ви починаєте з реєстру.
Затемнення

6
У прийнятій відповіді зазначено "... $ Host.Version і (Get-Host). Версія не є надійною - вони відображають лише версію хоста, а не движок" .
Пітер Мортенсен

21

Рекомендований корпорацією Майкрософт сумісний метод для перевірки встановлення 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

Я знайшов найпростіший спосіб перевірити, чи встановлено:

  • запустити командний рядок (Start, Run cmd, and OK)
  • введіть powershellтоді клавішу return. Потім слід отримати 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 .


3
Як і для прийнятої відповіді, це не повертає нічого для PowerShell 1.0. Метод реєстру є більш явним.
Пітер Мортенсен

4
Якщо в повному обсязі не було шляху, ця версія створить помилкове враження, що вона не встановлена. Метод Реєстру дає повну інформацію. Наявність та версія.
Xalorous

9

$host.versionпросто невірно / ненадійно. Це дає вам версію виконуваного хостингу (powershell.exe, powergui.exe, powershell_ise.exe, powershellplus.exe тощо), а не версію самого двигуна.

Версія двигуна міститься в $psversiontable.psversion. Для PowerShell 1.0 цієї змінної не існує, тому очевидно, якщо ця змінна недоступна, очевидно, можна вважати, що двигун 1,0, очевидно.


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
орад

6
Шукаєте версію PS? введіть $ PSVersion [вкладка] [введіть]. Зроблено. Не потрібно нічого пам’ятати :)
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.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"
}


1

Це головний результат пошуку для "Пакетного файлу отримати версію" shellhell ", тому я хотів би надати основний приклад того, як зробити умовний потік у пакетному файлі залежно від версії повноважень

Родовий приклад

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

Ви також можете викликати команду "хост" з командної лінії PowerShell. Це має дати вам значення $hostзмінної.


3
Це напівправильно. hostвирішує до Get-Host. Незважаючи на це, це не надійний спосіб отримати версію.
Максиміліан Бурслі

-1

Розширення відповіді за допомогою оператора вибору:

Get-Host | select {$_.Version}

7
У прийнятій відповіді зазначено "... $ Host.Version і (Get-Host). Версія не є надійною - вони відображають лише версію хоста, а не движок" .
Пітер Мортенсен

@PeterMortensen виглядає так, що моя відповідь була до прийнятої відповіді
HaBo

2
@HaBo Що ти дивишся? Відповідь прийнята з 2009 р.
TylerH

@TylerH так що? Я не стежу за вашим запитанням. моя відповідь чітко говорить про її розширення до прийнятої відповіді. його спрощена версія.
HaBo

2
@HaBo Ваш попередній коментар звучить так, що ви виправдовуєте свою відповідь тим, що вона була опублікована до прийнятої відповіді, що зовсім не так. Ваша відповідь була опублікована через 7 років після прийнятої відповіді, і через 6 років після відповіді ваша фактично «продовжується»; Якщо говорити про це, то у вашій відповіді чітко не сказано, що це розширення прийнятої відповіді (яке навіть не використовується Get-Host).
TylerH
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.