Jawaban:
Gunakan $PSVersionTable.PSVersion
untuk menentukan versi mesin. Jika variabel tidak ada, aman untuk menganggap mesin adalah versi 1.0
.
Perhatikan bahwa $Host.Version
dan (Get-Host).Version
tidak 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
$PSVersionTable
lebih 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 $host
hanya akan menunjukkan versi terendah yang mereka setujui untuk serialisasi. Sementara $PSVersionTable
akan menampilkan versi sebenarnya. Semoga itu akan membantu seseorang ..
notepad $profile
dan membuangnya function psver { $PSVersionTable; $PSVersionTable.PSVersion }
. Reload dengan . $profile
dan saya cukup mengetikkan psver
waktu untuk mendapatkan info versi detail dan detail lainnya.
Saya akan menggunakan Get-Host atau $ PSVersionTable . Seperti yang ditunjukkan Andy Schneider, $PSVersionTable
tidak 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
$host.version
tidak dapat diandalkan - misalnya di powergui, ia mengembalikan versi host powergui yang tidak sama dengan versi engine powershell (yang diinginkan.)
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
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"}
}
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.
cmd
dan powershell
tidak berhasil. Saya akan mengharapkan perilaku yang sama juga. :)
pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
bekerja dengan baik.
Anda dapat memverifikasi bahwa versi Windows PowerShell diinstal dengan menyelesaikan pemeriksaan berikut:
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/
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:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
Untuk memeriksa apakah PowerShell versi 1.0 atau 2.0 diinstal, periksa nilai berikut dalam registri:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
Saya menemukan cara termudah untuk memeriksa apakah diinstal adalah untuk:
cmd
,, lalu OK)powershell
lalu tekan kembali. Anda kemudian harus mendapatkan PS
prompt 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 exit
jika Anda ingin kembali ke prompt perintah ( exit
lagi jika Anda juga ingin menutup prompt perintah).
Untuk menjalankan skrip, lihat http://ss64.com/ps/syntax-run.html .
$host.version
jelas 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.
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 .
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-Variable
sudah (dan "Seharusnya ada sesuatu tentang versi").
$PSVersionTable
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 .
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
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"
}
Cmdlet di bawah ini akan mengembalikan versi PowerShell.
$PSVersionTable.PSVersion.Major
$PSVersionTable
adalah variabel otomatis; Sebuah Objek. Ini bukan cmdlet.
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
)
Anda juga dapat memanggil perintah "host" dari baris perintah PowerShell. Itu harus memberi Anda nilai $host
variabel.
host
memutuskan untuk Get-Host
. Apapun, itu bukan cara yang dapat diandalkan untuk mendapatkan versi.
Memperluas jawaban dengan operator terpilih:
Get-Host | select {$_.Version}
Get-Host
).