Ответы:
Используйте $PSVersionTable.PSVersion
для определения версии двигателя. Если переменная не существует, можно с уверенностью предположить, что двигатель является версией 1.0
.
Обратите внимание, что $Host.Version
и (Get-Host).Version
не являются надежными - они отражают только версию хоста, а не двигателя. PowerGUI, PowerShellPLUS и т. Д. - все они являются хост-приложениями, и они устанавливают версию хоста в соответствии с версией своего продукта - что совершенно правильно, но не то, что вы ищете.
PS C:\> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
4 0 -1 -1
$PSVersionTable
более надежен и возвращает $ PSVersion. Вы также можете использовать $PSVersionTable.PSVersion
. Даже если вы подключены удаленно к машине с другой версией ( invoke-command -computername myRemotePC -Credential foo {$host}
), похоже $host
, просто покажет самую низкую версию, которую они согласовали для сериализации. Пока $PSVersionTable
покажу верную версию. Надеюсь, это поможет кому-то ..
notepad $profile
и бросил function psver { $PSVersionTable; $PSVersionTable.PSVersion }
в нем. Перезагрузите, . $profile
и я могу просто напечатать в psver
любое время, чтобы получить подробную информацию о версии и другие детали.
Я бы использовал 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
$host.version
не является надежным - например, в PowerGUI, он возвращает версию хоста PowerGUI, которая не совпадает с версией двигателя
Вы можете посмотреть на встроенную переменную $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"}
}
Вы можете напрямую проверить версию одной строкой, вызывая PowerShell извне , например из командной строки
powershell -Command "$PSVersionTable.PSVersion"
Согласно @psaul, вы можете иметь одну команду, которая не зависит от того, откуда она пришла (CMD, PowerShell или Pwsh). Спасибо за это.
powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
Я тестировал, и он работал безупречно как на CMD, так и на PowerShell.
cmd
и powershell
безрезультатно. Я бы тоже ожидал такого же поведения. :)
pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
работает отлично.
Вы можете проверить, установлена ли версия Windows PowerShell, выполнив следующую проверку:
В консоли Windows PowerShell введите следующую команду в командной строке и нажмите клавишу ВВОД:
Get-Host | Select-Object Version
Вы увидите вывод, который выглядит следующим образом:
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
Чтобы проверить, установлена ли версия 1.0 или 2.0 PowerShell, проверьте следующее значение в реестре:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
Я нашел самый простой способ проверить, установлен ли он:
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 .
$host.version
это просто неправильно / ненадежно. Это дает вам версию исполняемого файла хостинга (powershell.exe, powergui.exe, powershell_ise.exe, powershellplus.exe и т. Д.), А не версию самого движка.
Версия двигателя содержится в $psversiontable.psversion
. Для PowerShell 1.0 эта переменная не существует, поэтому, очевидно, что если эта переменная недоступна, вполне можно предположить, что движок равен 1.0.
Использование:
$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 .
Самый простой способ забыть эту страницу и никогда не возвращаться к ней - это изучить Get-Variable
:
Get-Variable | where {$_.Name -Like '*version*'} | %{$_[0].Value}
Нет необходимости запоминать каждую переменную. Просто Get-Variable
достаточно (и «Там должно быть что-то о версии»).
$PSVersionTable
Чтобы проверить, установлен ли 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
Источник: этот сайт .
Так как самый полезный ответ не касался части « если существует» , я подумал, что можно дать один ответ на это через быстрое и грязное решение. Он полагается на то, что 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, а затем запустить соответствующий код. Некоторые из наших серверов работают под управлением 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"
}
Приведенный ниже командлет вернет версию PowerShell.
$PSVersionTable.PSVersion.Major
$PSVersionTable
является автоматической переменной; объект. Это не командлет.
Это лучший результат поиска для «Пакетный файл получить версию 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
переменной.
host
решает до Get-Host
. Несмотря на это, это не надежный способ получить версию.
Расширение ответа с помощью оператора выбора:
Get-Host | select {$_.Version}
Get-Host
).