Відповіді:
Використовуйте $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, яка не є такою ж, як версія двигуна powerhell (що бажано.)
Ви можете подивитися на вбудованому змінному $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 введіть таку команду в командному рядку та натисніть клавішу ENTER:
Get-Host | Select-Object Version
Ви побачите вихід, який виглядає приблизно так:
Version
-------
3.0
http://www.myerrorsandmysolutions.com/how-to-verify-the-windows-powershell-version-installed/
Рекомендований корпорацією Майкрософт сумісний метод для перевірки встановлення 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
, 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 .
$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.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
- автоматична змінна; об’єкт. Це не командлет.
Це головний результат пошуку для "Пакетного файлу отримати версію" 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
)
Ви також можете викликати команду "хост" з командної лінії PowerShell. Це має дати вам значення $host
змінної.
host
вирішує до Get-Host
. Незважаючи на це, це не надійний спосіб отримати версію.
Розширення відповіді за допомогою оператора вибору:
Get-Host | select {$_.Version}
Get-Host
).