Определить установленную версию 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, выполнив следующую проверку:
- Нажмите "Пуск", выберите "Все программы", "Стандартные", "Windows PowerShell" и "Windows PowerShell".
В консоли 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
затем нажмите кнопку возврата. Затем вы должны получить PowerShellPS
незамедлительный:
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
}
Очень старый вопрос, но все еще актуальный, просто сейчас в 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. Вторая строка результата - версия.
Получить версию 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