Yüklü PowerShell sürümünü belirleme


2632

Bir bilgisayarda hangi PowerShell sürümünün yüklü olduğunu ve gerçekten de yüklü olup olmadığını nasıl belirleyebilirim?

Yanıtlar:


3583

$PSVersionTable.PSVersionMotor sürümünü belirlemek için kullanın . Değişken yoksa, motorun sürüm olduğunu varsaymak güvenlidir1.0 .

Unutmayın $Host.Versionve (Get-Host).Versiongüvenilir değildirler - motorun değil, yalnızca ana bilgisayarın sürümünü yansıtırlar. PowerGUI, PowerShellPLUS, vb. Tüm barındırma uygulamalarıdır ve ana bilgisayarın sürümünü ürün sürümlerini yansıtacak şekilde ayarlarlar - bu tamamen doğrudur, ancak aradığınız şeyi değil.

PS C:\> $PSVersionTable.PSVersion

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

2
@DanielCassidy - partiye iki yıl geç kaldı, ancak "bazı özelliklerin sorumsuzca kullanılamaması" yalnızca tam şey yerine .Net 3.5 Compact çerçevesinin yüklü olmasından kaynaklanabilir.
Dave Neeley

83
$PSVersionTabledaha güvenilir ve $ PSVersion döndürür. Ayrıca kullanabilirsiniz $PSVersionTable.PSVersion. Farklı sürüm ( invoke-command -computername myRemotePC -Credential foo {$host}) çalıştıran makineye uzaktan bağlansanız bile $host, serileştirme için kabul ettikleri en düşük sürümü gösterecek gibi görünüyor . Iken $PSVersionTablegerçek sürümü gösterecektir. Birine yardımcı olacağını umuyoruz ..
vulcan kuzgun

16
Versiyon iyi görünüyor.Version iyi bir seçim değil ... PowerShell 3 çalıştıran bir makineye uzaktan kumanda ederseniz, RemotingHost v1 gibi göründüğü için 1.0'a geri dönersiniz. $ PSVersionTable kullanmak doğru bir şekilde 3 değerini döndürür.
Danny Tuppeny

25
@ Starfish Gösterilen komut, Komut İstemi'ni kullanarak Powershell'i başlatır. Yüklü değilse komut sadece "powershell bulunamadı" ile hata yapmaz mı?
jpmc26

9
Bunun için buraya gelmekten çok yoruldum, sadece koştum notepad $profileve içine atıldım function psver { $PSVersionTable; $PSVersionTable.PSVersion }. Bir yeniden yükleme . $profileve ben sadece psverdetaylı sürüm bilgisi ve diğer ayrıntıları almak için her zaman yazabilirsiniz .
ADTC

432

Ben de kullanırsınız GET-ana bilgisayar veya $ PSVersionTable . Andy Schneider'in belirttiği gibi $PSVersionTable, sürüm 1'de çalışmıyor; sürüm 2'de tanıtıldı.

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
teşekkür ederim! Not: v1 Powershell'den el ile yükselttiğim XP'mde, gerçek klasör ve kayıt defteri yolları (yanıltıcı mı ?!) v1 DEĞİL başvuru v2. Buradaki diğerlerinin belirttiği gibi, ancak onu yükleyip yüklemediğimden bu kadar endişelendim. Benim yolum; C: \ WINDOWS \ system32 \ windowspowershell \ v1.0
AnneTheAgile

4
$ Psversiontable mevcut değilse, v1.0'da olduğunuzu varsaymak tamamen güvenlidir - ve hey presto, bu da sorunuza cevap verir. $host.versiongüvenilir değildir - örneğin powergui'de, powershell motor sürümü ile aynı olmayan powergui ana bilgisayar sürümünü döndürür (istenen budur.)
x0n 17:13

10
Kabul edilen cevap "... $ Host.Version ve (Get-Host) .Sürümü güvenilir değildir - motorun değil, yalnızca ana bilgisayarın sürümünü yansıtır" .
Peter Mortensen

99

Yerleşik değişkene bakabilirsiniz $psversiontable. Eğer yoksa, V1'iniz var demektir. Varsa, ihtiyacınız olan tüm bilgileri verecektir.

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'in yüklü olup olmadığını belirlemek için, kayıt defterinin

HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install

ve

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3

ve varsa, blog gönderisinde ayrıntılı olarak açıklandığı gibi değerin 1 (yüklü için) olup olmadığı PowerShell'in yüklü olup olmadığını ve sürümünü kontrol edin .

Yüklü PowerShell sürümünü belirlemek için kayıt defteri anahtarlarını denetleyebilirsiniz

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion

ve

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine\PowerShellVersion

İçinde PowerShell.com ayrıntıları gibi bir .ps1 komut dosyasından yüklenir PowerShell sürümünü belirlemek için, aşağıdaki tek astar kullanabilirsiniz Hangi PowerShell Versiyon Am I Running .

$isV2 = test-path variable:\psversiontable

Aynı site, sürümü döndürmek için bir işlev de verir:

function Get-PSVersion {
    if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}

4
Yararlı çünkü bir Windows 2003 sunucusunda PowerShell için başlat menüsü girdisini bulamadım (oradaydı ama belli değil), ancak kayıt defteri anahtarı sorumu yanıtladı.
Holistic Developer

7
PowerScript 3.0 için HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 ( HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1'e ek olarak) yeni bir giriş var gibi görünüyor . Bu durumda sürümü almak için uygun yer HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 \ PowerShellEngine \ PowerShellVersion (örnek değeri "3.0") gibi görünüyor.
Peter Mortensen

48

Komut İstemi gibi PowerShell'i harici olarak çağırarak sürümü doğrudan bir satırla kontrol edebilirsiniz.

powershell -Command "$PSVersionTable.PSVersion"

Göre @psaul sen yapabilirsiniz aslında (CMD, PowerShell veya Pwsh) geldi yerden agnostik olan bir komut var. Bunun için teşekkür ederim.

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

Test ettim ve hem CMD hem de PowerShell üzerinde kusursuz bir şekilde çalıştı.

görüntü


Bu korkunç hatayı şu şekilde alıyorum: "System.Collections.Hashtable.PSVersion: 'System.Collections.Hashtable.PSVersion' terimi bir cmdlet, işlev, komut dosyası veya çalıştırılabilir programın adı olarak tanınmıyor. adın yazımı veya bir yol eklenmişse, yolun doğru olduğunu doğrulayın ve tekrar deneyin. " Yani her zaman işe
yaramaz

Köşe vakalarını bilmek iyi olduğu için bunu belirttiğinize sevindim, ancak sanırım hala insanların çoğunluğu için çalışıyor.
Patrick Bard

@Gonmator, PowerShell'in bu komutla aynı şekilde davranacağını düşünürdü, ancak maalesef öyle değil. Ben sözdizimi agnostic arasında boşuna cmdve işe yaramayacak şekilde düzeltmek için girişimde bulundum powershell. Ben de aynı davranışı beklerdim. :)
tresf

3
@tresf (ve @Gonmator) bunu CMD, PowerShell ve hatta Pwsh'den (PS 6.0) agnost olarak çalıştırabilirsiniz, ancak bu formu kullanmanız gerekir: powershell -command "(Get-Variable PSVersionTable -ValueOnly) .PSVersion" ( her durumda çalışır)
PSaul

Mac'te de test edildi. pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" harika çalışıyor.
tresf

37

Aşağıdaki denetimi tamamlayarak Windows PowerShell sürümünün yüklü olduğunu doğrulayabilirsiniz:

  1. Başlat'ı, Tüm Programlar'ı, Donatılar'ı, Windows PowerShell'i ve ardından Windows PowerShell'i tıklatın.
  2. Windows PowerShell konsolunda, komut istemine aşağıdaki komutu yazın ve ENTER tuşuna basın:

    Get-Host | Select-Object Version

Şuna benzeyen bir çıktı göreceksiniz:

Version
-------
3.0

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


1
Powershell'in varsayılan seçeneklerle yüklendiğini ve kısayolların Başlat Menüsü'nden kaldırılmadığını varsayarsınız. Kayıt defteri testini kullanmak daha iyidir.
Xalorous

Öncelikle PowerShell'i kullanmanız gerekiyorsa, onu standart olarak çalıştırmayı denerseniz, o zaman simgeyi bulamazsanız, aramayı denerseniz, belki de Komut İstemi'nden çalıştırmayı deneyin. Kayıt defterinden başladığını sanmıyorum.
Tutulmalar

6
Kabul edilen cevap "... $ Host.Version ve (Get-Host) .Sürümü güvenilir değildir - motorun değil, yalnızca ana bilgisayarın sürümünü yansıtır" .
Peter Mortensen

21

Microsoft'un PowerShell'in yüklü olup olmadığını kontrol etmek ve yüklü sürümü belirlemek için önerilen ileri uyumlu yöntemi iki özel kayıt defteri anahtarına bakmaktır. Bağlantının kopması durumunda ayrıntıları burada yeniden oluşturdum.

Bağlantı verilen sayfaya göre:

Diğer kayıt defteri anahtarlarına veya PowerShell.exe sürümüne veya PowerShell.exe'nin konumuna bağlı olarak uzun vadede çalışacağı garanti edilmez.

Olmadığını kontrol etmek için herhangi bir sürüm PowerShell yüklü olduğu defterinde aşağıdaki değer denetlemek,:

  • Anahtar Konum: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
  • Değer Adı: Yükle
  • Değer Türü: REG_DWORD
  • Değer Verisi: 0x00000001 (1

Kontrol etmek sürüm 1.0 veya 2.0 olsun PowerShell yüklenir, kayıt defterinde aşağıdaki değeri kontrol edin:

  • Anahtar Konum: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
  • Değer Adı: PowerShellVersion
  • Değer Türü: REG_SZ
  • Değer Verisi: <1.0 | 2.0>

5
PowerShell 3.0 için, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 gibi yeni bir tane var gibi görünüyor .
Peter Mortensen

11

Yüklü olup olmadığını kontrol etmenin en kolay yolunu buldum:

  • bir komut istemi çalıştırın (Başlat, Çalıştır, cmd , sonra Tamam)
  • yazın ve powershellgeri dön tuşuna basın. Daha sonra PowerShell PSistemini almalısınız :

C:\Users\MyUser>powershell

Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\Users\MyUser>

Ardından, PowerShell isteminden sürümü yazarak kontrol edebilirsiniz $PSVersionTable.PSVersion:

PS C:\Users\MyUser> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1

PS C:\Users\MyUser>

Tip exitistemi komutuyla (geri dönmek istiyorsanız exitsiz de yakın komuta istemi istiyorum tekrar varsa).

Komut dosyalarını çalıştırmak için bkz. Http://ss64.com/ps/syntax-run.html .


3
Kabul edilen cevap için olduğu gibi bu PowerShell 1.0 için hiçbir şey döndürmez. Kayıt defteri yöntemi daha açıktır.
Peter Mortensen

4
Powershell yolda değilse, bu sürüm yüklü olmadığı konusunda yanlış bir izlenim bırakacaktır. Registry yöntemi tam bilgi verir. Varlık ve sürüm.
Xalorous

9

$host.versionsadece yanlış / güvenilmez. Bu size hosting çalıştırılabilir sürümünü (powershell.exe, powergui.exe, powershell_ise.exe, powershellplus.exe vb.) Ve değil motorun sürümünü , Sürümünü verir.

Motor sürümü bulunur $psversiontable.psversion. PowerShell 1.0 için, bu değişken mevcut değildir, bu yüzden bu değişken mevcut değilse, motorun 1.0 olduğunu varsaymak tamamen güvenlidir.


9

kullanın:

$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'}
}

Yüklü PowerShell sürümünü belirleme bölümünden ayrıntılı komut dosyasını indirebilirsiniz .


8

Bu sayfayı unutmanın ve asla geri dönmemenin en kolay yolu Get-Variableşunları öğrenmektir :

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

Her değişkeni hatırlamaya gerek yoktur. Sadece Get-Variableyeter (ve "Sürüm hakkında bir şey olmalı").


8
Hangisi ile aynı$PSVersionTable
orad

6
PS sürümünü mü arıyorsunuz? $ PSVersion [sekme] [enter] yazın. Bitti. Hiçbir şey hatırlamanıza gerek yok :)
orad

1
bu gerçekten sadece kullanılan boru numaralarına çok aşina ise yararlıdır. Yeni başlayanların tüm sözdiziminin $ PSVersionTable'ı hatırlamaktan daha kolay olduğunu hatırlayamayacak
Joseph Gabriel

1
Beyler, Get-Variable (sadece sürümü almak için ihtiyacınız olan her şey varsa) iyi yalnız çalışır, boru sadece bir şaka var :) Ben de boru sözdizimi hatırlamıyorum.
Roman Pokrovskij

7

PowerShell'in yüklü olup olmadığını kontrol etmek için şunu kullanın:

HKLM\Software\Microsoft\PowerShell\1 Install ( = 1 )

RC2 veya RTM'nin yüklü olup olmadığını kontrol etmek için şunu kullanın:

HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-00301) -- For RC2
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-04309) -- For RTM

Kaynak: bu web sitesi .


7

En yararlı cevap, eğer var olan kısmı ele almadığından, hızlı ve kirli bir çözümle bir tane vereceğimi düşündüm. PowerShell'in muhtemelen istediğiniz gibi olan yol ortamı değişkeninde olmasına dayanır . (Bunu bilmediğim gibi üstteki cevaba yazın.) Bunu bir metin dosyasına yapıştırın ve adlandırın

Test Powershell Sürüm.cmd

veya benzeri.

@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 sürümünü kontrol edip uygun kodu çalıştırmam gerekiyordu. Bazı sunucularımız v5, diğerleri v4 çalıştırıyor. Bu, sıkıştırma gibi bazı işlevlerin kullanılabileceği veya bulunmayabileceği anlamına gelir.

Bu benim çözümüm:

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

Bu "Toplu dosya powershell sürümünü almak" için en iyi arama sonucudur, bu yüzden powershell sürümüne bağlı olarak bir toplu iş dosyasında koşullu akış nasıl yapılacağına dair temel bir örnek vermek istiyorum

Genel örnek

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

Gerçek dünya örneği

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 komut satırından "host" komutunu da çağırabilirsiniz. Size $hostdeğişkenin değerini vermelidir .


3
Bu yarı yanlış. hostkarar verir Get-Host. Ne olursa olsun, sürümü almanın güvenilir bir yolu değildir.
Maximilian Burszley

-1

Cevabı belirli bir operatörle genişletme:

Get-Host | select {$_.Version}

7
Kabul edilen cevap "... $ Host.Version ve (Get-Host) .Sürümü güvenilir değildir - motorun değil, yalnızca ana bilgisayarın sürümünü yansıtır" .
Peter Mortensen

@PeterMortensen cevabım kabul edilen yanıttan önce olmuş gibi görünüyor
HaBo

2
@HaBo Neye bakıyorsunuz? Kabul edilen cevap 2009'dan.
TylerH

@TylerH ne olmuş yani? Sorunu takip etmiyorum. cevabım açıkça kabul edilen cevabın bir uzantısı olduğunu söylüyor. onun basitleştirilmiş bir versiyonu.
HaBo

2
@HaBo Önceki yorumunuz, cevabınızı kabul edilen cevaptan önce gönderilmiş olması gerçeğiyle doğruladığınız gibi görünüyor, ki bu hiç de geçerli değil. Cevabınız kabul edilen cevaptan 7 yıl sonra ve cevabınızdan 6 yıl sonra aslında 'uzar'; hangisi konuşursanız, cevabınız bunun kabul edilen cevabın bir uzantısı olduğunu (hatta kullanmıyor Get-Host) açıkça belirtmez .
TylerH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.