Tentukan versi PowerShell yang diinstal

2632

Bagaimana saya bisa menentukan versi PowerShell yang diinstal pada komputer, dan memang jika itu diinstal sama sekali?

MagicAndi
sumber

Jawaban:

3585

Gunakan $PSVersionTable.PSVersionuntuk menentukan versi mesin. Jika variabel tidak ada, aman untuk menganggap mesin adalah versi 1.0.

Perhatikan bahwa $Host.Versiondan (Get-Host).Versiontidak dapat diandalkan - hanya mencerminkan versi host, bukan engine. PowerGUI, PowerShellPLUS, dll. Semuanya adalah aplikasi hosting, dan mereka akan mengatur versi host untuk mencerminkan versi produk mereka - yang sepenuhnya benar, tetapi bukan yang Anda cari.

PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      -1     -1
pengguna156862
sumber
2
@DanielCassidy - dua tahun terlambat ke pesta, tetapi "beberapa fitur tidak tersedia secara tidak bertanggung jawab" mungkin disebabkan oleh hanya memiliki .Net 3.5 Compact framework diinstal bukan hal yang lengkap.
Dave Neeley
83
$PSVersionTablelebih dapat diandalkan dan mengembalikan $ PSVersion. Anda juga bisa menggunakan $PSVersionTable.PSVersion. Bahkan jika Anda terhubung dari jarak jauh ke mesin yang menjalankan versi yang berbeda ( invoke-command -computername myRemotePC -Credential foo {$host}), sepertinya $hosthanya akan menunjukkan versi terendah yang mereka setujui untuk serialisasi. Sementara $PSVersionTableakan menampilkan versi sebenarnya. Semoga itu akan membantu seseorang ..
gagak vulcan
16
Tampaknya $ host. Versi bukan pilihan yang baik ... Jika Anda jauh ke mesin yang menjalankan PowerShell 3, Anda mendapatkan kembali 1,0, karena RemotingHost tampaknya menjadi v1. Menggunakan $ PSVersionTable dengan benar mengembalikan 3.
Danny Tuppeny
25
@Starfish Perintah yang ditampilkan meluncurkan Powershell menggunakan Command Prompt. Bukankah perintah hanya kesalahan dengan "powershell not found" jika itu tidak diinstal?
jpmc26
9
Sangat lelah kembali ke sini untuk hal ini sehingga saya hanya berlari notepad $profiledan membuangnya function psver { $PSVersionTable; $PSVersionTable.PSVersion }. Reload dengan . $profiledan saya cukup mengetikkan psverwaktu untuk mendapatkan info versi detail dan detail lainnya.
ADTC
434

Saya akan menggunakan Get-Host atau $ PSVersionTable . Seperti yang ditunjukkan Andy Schneider, $PSVersionTabletidak berfungsi di versi 1; diperkenalkan di versi 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
Thomas Bratt
sumber
5
Terima kasih! NB: Di XP saya di mana saya memutakhirkan secara manual dari v1 Powershell, folder aktual dan jalur registri (menyesatkan ?!) referensi v1 BUKAN v2. Ini seperti yang ditentukan orang lain di sini, tetapi itu adalah alasan mengapa saya sangat khawatir apakah saya telah menginstalnya. Jalanku adalah; C: \ WINDOWS \ system32 \ windowspowershell \ v1.0
AnneTheAgile
4
Jika $ psversiontable tidak ada, sepenuhnya aman untuk menganggap Anda menggunakan v1.0 - dan hei presto, itu juga menjawab pertanyaan Anda. $host.versiontidak dapat diandalkan - misalnya di powergui, ia mengembalikan versi host powergui yang tidak sama dengan versi engine powershell (yang diinginkan.)
x0n
10
Jawaban yang diterima menyatakan "... $ Host.Version dan (Get-Host) .Version tidak dapat diandalkan - hanya mencerminkan versi host saja, bukan engine" .
Peter Mortensen
100

Anda dapat melihat variabel bawaan $psversiontable,. Jika tidak ada, Anda memiliki V1. Jika memang ada, itu akan memberi Anda semua info yang Anda butuhkan.

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    
Andy Schneider
sumber
97

Untuk menentukan apakah PowerShell diinstal, Anda dapat memeriksa keberadaan registri

HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install

dan

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3

dan, jika ada, apakah nilainya 1 (untuk diinstal), sebagaimana dirinci dalam posting blog Periksa apakah PowerShell diinstal dan versi .

Untuk menentukan versi PowerShell yang diinstal, Anda dapat memeriksa kunci registri

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

dan

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

Untuk menentukan versi PowerShell yang diinstal dari skrip .ps1, Anda dapat menggunakan one-liner berikut, seperti yang dijelaskan pada PowerShell.com di Versi PowerShell mana yang Saya Berlari .

$isV2 = test-path variable:\psversiontable

Situs yang sama juga memberikan fungsi untuk mengembalikan versi:

function Get-PSVersion {
    if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}
MagicAndi
sumber
4
Berguna karena pada server Windows 2003 saya tidak dapat menemukan entri menu mulai untuk PowerShell (ada di sana tetapi tidak jelas), tetapi kunci registri menjawab pertanyaan saya.
Pengembang Holistik
7
Untuk PowerScript 3.0 sepertinya ada entri baru, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 (selain HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 ). Tempat yang tepat dalam kasus ini untuk mendapatkan versi tampaknya HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 \ PowerShellEngine \ PowerShellVersion (nilai sampel adalah "3.0").
Peter Mortensen
49

Anda dapat langsung memeriksa versi hanya dengan satu baris dengan menggunakan PowerShell secara eksternal , seperti dari Command Prompt

powershell -Command "$PSVersionTable.PSVersion"

Menurut @psaul Anda sebenarnya dapat memiliki satu perintah yang agnostik dari tempat asalnya (CMD, PowerShell atau Pwsh). Terima kasih untuk itu.

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

Saya telah menguji dan bekerja dengan baik pada CMD dan PowerShell.

Gambar

Patrick Bard
sumber
Saya mendapatkan kesalahan mengerikan ini dengan percobaan itu: "System.Collections.Hashtable.PSVersion: Istilah 'System.Collections.Hashtable.PSVersion' tidak dikenali sebagai nama cmdlet, fungsi, file skrip, atau program yang dapat dioperasikan. Periksa pengejaan nama, atau jika jalan dimasukkan, verifikasi bahwa jalan itu benar dan coba lagi. " Jadi tidak selalu berhasil
Gonmator
Saya senang Anda menunjukkannya karena itu baik untuk mengetahui kasus sudut, tapi saya kira itu masih berfungsi untuk sebagian besar orang.
Patrick Bard
@Gonmator orang akan berpikir PowerShell akan berperilaku dengan cara yang sama dengan perintah ini, tetapi sayangnya tidak. Saya membuat upaya untuk memperbaiki sintaks untuk bekerja secara agnostik antara cmddan powershelltidak berhasil. Saya akan mengharapkan perilaku yang sama juga. :)
tresf
3
@tresf (dan @Gonmator) Anda BISA menjalankan ini secara agnostik dari CMD, PowerShell, atau bahkan Pwsh (PS 6.0) tetapi Anda perlu menggunakan formulir ini: powershell -command "(Get-Variable PSVersionTable -ValueOnly) .PSVersion" (yang akan bekerja dalam semua kasus)
PSaul
Diuji pada mac juga. pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" bekerja dengan baik.
tresf
38

Anda dapat memverifikasi bahwa versi Windows PowerShell diinstal dengan menyelesaikan pemeriksaan berikut:

  1. Klik Mulai, klik Semua Program, klik Aksesori, klik Windows PowerShell, lalu klik Windows PowerShell.
  2. Di konsol Windows PowerShell, ketikkan perintah berikut di command prompt dan kemudian tekan ENTER:

    Get-Host | Select-Object Version

Anda akan melihat output yang terlihat seperti ini:

Version
-------
3.0

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

Gerhana
sumber
1
Anda berasumsi bahwa PowerShell telah diinstal dengan opsi default dan bahwa pintasan tidak dihapus dari Start Menu. Lebih baik menggunakan tes registri.
Xalorous
Saya pikir jika Anda perlu menggunakan PowerShell terlebih dahulu Anda mencoba menjalankannya sebagai standar itu harus diinstal, maka jika Anda tidak menemukan ikon Anda mencoba mencarinya, maka mungkin Anda mencoba menjalankannya dari Command Prompt. Saya tidak berpikir Anda mulai dari registri.
Eclipses
6
Jawaban yang diterima menyatakan "... $ Host.Version dan (Get-Host) .Version tidak dapat diandalkan - hanya mencerminkan versi host saja, bukan engine" .
Peter Mortensen
21

Disarankan metode maju yang kompatibel oleh Microsoft untuk memeriksa apakah PowerShell diinstal dan menentukan versi yang diinstal adalah untuk melihat dua kunci registri spesifik. Saya telah mereproduksi detailnya di sini jika tautannya putus.

Menurut halaman yang ditautkan:

Bergantung pada kunci registri lainnya, atau versi PowerShell.exe atau lokasi PowerShell.exe tidak dijamin berfungsi dalam jangka panjang.

Untuk memeriksa apakah versi PowerShell diinstal, periksa nilai berikut dalam registri:

  • Lokasi Utama: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
  • Nama Nilai: Pasang
  • Jenis Nilai: REG_DWORD
  • Nilai Data: 0x00000001 (1

Untuk memeriksa apakah PowerShell versi 1.0 atau 2.0 diinstal, periksa nilai berikut dalam registri:

  • Lokasi Utama: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
  • Nama Nilai: PowerShellVersion
  • Jenis Nilai: REG_SZ
  • Nilai Data: <1.0 | 2.0>
Bintang laut
sumber
5
Untuk PowerShell 3.0, tampaknya ada yang baru, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 .
Peter Mortensen
11

Saya menemukan cara termudah untuk memeriksa apakah diinstal adalah untuk:

  • jalankan prompt perintah (Mulai, Jalankan, cmd ,, lalu OK)
  • ketik powershelllalu tekan kembali. Anda kemudian harus mendapatkan PSprompt PowerShell :

C:\Users\MyUser>powershell

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

PS C:\Users\MyUser>

Anda kemudian dapat memeriksa versi dari prompt PowerShell dengan mengetik $PSVersionTable.PSVersion:

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

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

PS C:\Users\MyUser>

Ketik exitjika Anda ingin kembali ke prompt perintah ( exitlagi jika Anda juga ingin menutup prompt perintah).

Untuk menjalankan skrip, lihat http://ss64.com/ps/syntax-run.html .

SharpC
sumber
3
Seperti untuk jawaban yang diterima, ini tidak mengembalikan apa pun untuk PowerShell 1.0. Metode registri lebih eksplisit.
Peter Mortensen
4
Jika PowerShell tidak ada di jalur, versi ini akan memberikan kesan palsu bahwa itu tidak diinstal. Metode Registry memberikan informasi lengkap. Kehadiran dan versi.
Xalorous
9

$host.versionjelas salah / tidak bisa diandalkan. Ini memberi Anda versi hosting yang dapat dieksekusi (powershell.exe, powergui.exe, powershell_ise.exe, powershellplus.exe dll) dan bukan versi mesin itu sendiri.

Versi mesin dimuat dalam $psversiontable.psversion. Untuk PowerShell 1.0, variabel ini tidak ada, jadi jelas jika variabel ini tidak tersedia, sepenuhnya aman untuk menganggap mesinnya 1.0, jelas.

x0n
sumber
9

Menggunakan:

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

Anda dapat mengunduh skrip terperinci dari Cara menentukan versi PowerShell yang diinstal .

Dale Chen
sumber
8

Cara termudah untuk melupakan halaman ini dan tidak pernah kembali ke sana adalah mempelajari Get-Variable:

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

Tidak perlu mengingat setiap variabel. Cukup Get-Variablesudah (dan "Seharusnya ada sesuatu tentang versi").

Roman Pokrovskij
sumber
8
Yang sama dengan$PSVersionTable
orad
6
Mencari versi PS? ketik $ PSVersion [tab] [enter]. Selesai Tidak perlu mengingat apa pun :)
orad
1
ini benar-benar hanya berguna jika seseorang sangat akrab dengan trik perpipaan yang digunakan. Tidak mungkin seorang pemula akan dapat mengingat bahwa semua sintaksis itu lebih mudah daripada hanya mengingat $ PSVersionTable
Joseph Gabriel
1
Guys, Get-Variable berfungsi dengan baik sendiri (jika semua yang Anda butuhkan hanya untuk mendapatkan versi), perpipaan hanya ada lelucon :) Saya juga tidak ingat sintaks perpipaan.
Roman Pokrovskij
7

Untuk memeriksa apakah PowerShell diinstal gunakan:

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

Untuk memeriksa apakah RC2 atau RTM diinstal, gunakan:

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

Sumber: situs web ini .

Daniel Elliott
sumber
7

Karena jawaban yang paling membantu tidak membahas bagian jika ada , saya pikir saya akan mengambil satu melalui solusi cepat dan kotor. Itu bergantung pada PowerShell berada di variabel lingkungan jalur yang mungkin apa yang Anda inginkan. (Hat tip ke jawaban atas karena saya tidak tahu itu.) Tempel ini ke file teks dan beri nama

Test Powershell Version.cmd

atau serupa.

@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
Pecos Bill
sumber
4

Saya perlu memeriksa versi PowerShell dan kemudian menjalankan kode yang sesuai. Beberapa server kami menjalankan v5, dan yang lainnya v4. Ini berarti bahwa beberapa fungsi, seperti kompres, mungkin atau mungkin tidak tersedia.

Ini solusi saya:

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"
}
Atron Seige
sumber
3

Cmdlet di bawah ini akan mengembalikan versi PowerShell.

$PSVersionTable.PSVersion.Major
Venkatakrishnan
sumber
2
$PSVersionTableadalah variabel otomatis; Sebuah Objek. Ini bukan cmdlet.
Maximilian Burszley
1

Ini adalah hasil pencarian teratas untuk "File batch dapatkan versi PowerShell", jadi saya ingin memberikan contoh dasar tentang bagaimana melakukan aliran bersyarat dalam file batch tergantung pada versi PowerShell

Contoh umum

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

Contoh dunia nyata

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
)
Derpy
sumber
0

Anda juga dapat memanggil perintah "host" dari baris perintah PowerShell. Itu harus memberi Anda nilai $hostvariabel.

Tylor Durden
sumber
3
Ini semi-salah. hostmemutuskan untuk Get-Host. Apapun, itu bukan cara yang dapat diandalkan untuk mendapatkan versi.
Maximilian Burszley
-1

Memperluas jawaban dengan operator terpilih:

Get-Host | select {$_.Version}
HaBo
sumber
7
Jawaban yang diterima menyatakan "... $ Host.Version dan (Get-Host) .Version tidak dapat diandalkan - hanya mencerminkan versi host saja, bukan engine" .
Peter Mortensen
@PeterMortensen sepertinya jawaban saya sebelum jawaban diterima
HaBo
2
@ HaBo Apa yang kamu lihat? Jawaban yang diterima adalah dari 2009.
TylerH
@ TylerH jadi apa? Saya tidak mengikuti pertanyaan Anda. jawaban saya dengan jelas mengatakan ekstensi untuk jawaban yang diterima. ini versi yang disederhanakan.
HaBo
2
@ HaBo Komentar Anda sebelumnya berbunyi seperti Anda membenarkan jawaban Anda dengan fakta bahwa itu diposting sebelum jawaban yang diterima, yang sama sekali tidak terjadi. Jawaban Anda diposting 7 tahun setelah jawaban diterima, dan 6 tahun setelah jawaban Anda benar-benar 'meluas'; ngomong-ngomong, jawaban Anda tidak dengan jelas mengatakan itu merupakan perpanjangan dari jawaban yang diterima (yang bahkan tidak digunakan Get-Host).
TylerH