Bagaimana saya bisa menentukan apa versi PowerShell diinstal pada komputer, dan memang jika diinstal pada semua?
Gunakan $PSVersionTable.PSVersion
untuk menentukan versi mesin. Jika variabel tidak ada, itu adalah aman untuk mengasumsikan mesin adalah versi 1.0
.
Perhatikan bahwa $Host.Versi
dan (Get-Host).Versi
tidak dapat diandalkan - mereka mencerminkan
versi dari tuan rumah saja, bukan mesin. PowerGUI,
PowerShellPLUS, dll. semua hosting aplikasi, dan
mereka akan menetapkan tuan rumah's versi untuk mencerminkan produk mereka
versi — yang sepenuhnya benar, tetapi tidak apa yang anda're looking for.
PS C:\> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
4 0 -1 -1
Saya akan menggunakan salah Get-Host atau $PSVersionTable. Sebagai Andy Schneider poin, $PSVersionTable
doesn't bekerja pada 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
Untuk menentukan apakah PowerShell diinstal, anda dapat memeriksa registri untuk keberadaan
HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install
dan
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3
dan, jika ada, apakah nilai adalah 1 (untuk diinstal), seperti yang dijelaskan dalam posting blog Check jika 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 .ps1, anda dapat menggunakan berikut satu-liner, seperti yang dijelaskan pada PowerShell.com di Yang Versi PowerShell aku Berjalan.
$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 melihat yang dibangun dalam variabel, $psversiontable
. Jika itu doesn't ada, anda telah V1. Jika itu tidak ada, itu akan memberikan 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
Anda dapat langsung memeriksa versi dengan satu baris hanya dengan menerapkan PowerShell eksternal, seperti dari Command Prompt
powershell -Command "$PSVersionTable.PSVersion"
Menurut @psaul anda bisa benar-benar memiliki satu perintah yang agnostik dari mana ia datang (CMD, PowerShell atau Pwsh). Terima kasih untuk itu.
powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
I'telah diuji dan bekerja dengan sempurna pada kedua CMD dan PowerShell.
Anda dapat memverifikasi bahwa Windows PowerShell versi diinstal dengan menyelesaikan centang berikut:
Mendapatkan Host | Pilih-Objek Versi
Anda akan melihat output yang terlihat seperti ini:
Version
-------
3.0
http://www.myerrorsandmysolutions.com/how-to-verify-the-windows-powershell-version-installed/
Microsoft's direkomendasikan ke depan kompatibel metode untuk memeriksa jika PowerShell diinstal dan menentukan diinstal version adalah untuk melihat dua kunci registri khusus. I've direproduksi rincian di sini jika link rusak.
Menurut halaman terkait:
Tergantung pada kunci registri(s), atau versi PowerShell.exe atau lokasi PowerShell.exe ini tidak dijamin untuk bekerja dalam jangka panjang.
Untuk memeriksa apakah versi PowerShell dipasang, periksa nilai berikut dalam registri:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
Untuk check apakah versi 1.0 atau 2.0 PowerShell dipasang, periksa nilai berikut dalam registri:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
Aku menemukan cara termudah untuk memeriksa jika dipasang adalah untuk:
cmd
, kemudian OK)powershell
kemudian tekan kembali. Maka anda harus mendapatkan PowerShell PS
prompt:C:\Users\MyUser>powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.
PS C:\Users\MyUser>
Anda kemudian dapat memeriksa versi dari PowerShell prompt dengan mengetik $PSVersionTable.PSVersion
:
PS C:\Users\MyUser> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1
PS C:\Users\MyUser>
Jenis keluar
jika anda ingin kembali ke command prompt (keluar
lagi jika anda juga ingin tutup command prompt).
Untuk menjalankan script, lihat http://ss64.com/ps/syntax-run.html.
$host.versi
sekadar salah/tidak dapat diandalkan. Ini memberikan anda versi hosting executable (powershell.exe, powergui.exe, powershell_ise.exe, powershellplus.exe dll) dan tidak **** versi dari mesin itu sendiri.
Versi mesin yang terkandung di $psversiontable.psversion
. Untuk PowerShell 1.0, variabel ini tidak ada, jadi jelas jika variabel ini tidak tersedia, maka sepenuhnya aman untuk mengasumsikan mesin 1.0, jelas.
Gunakan:
$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 men-download naskah yang rinci dari Cara menentukan diinstal versi PowerShell.
Untuk memeriksa apakah PowerShell diinstal menggunakan:
HKLM\Software\Microsoft\PowerShell\1 Install ( = 1 )
Untuk memeriksa apakah RC2 atau RTM diinstal menggunakan:
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: website.
Karena yang paling membantu menjawab didn't alamat jika ada bagian, saya pikir saya'a memberikan satu mengambil itu melalui cepat-dan-kotor solusi. Hal itu bergantung pada PowerShell berada di jalan variabel lingkungan yang kemungkinan apa yang anda inginkan. (Hat tip ke atas jawabannya seperti yang saya didn't tahu itu.) Paste ke dalam teks file dan nama
Tes Versi Powershell.cmd
atau mirip.
@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
Cara termudah untuk melupakan halaman ini dan tidak pernah kembali ke sana adalah untuk mempelajari Get-Variabel
:
Get-Variable | where {$_.Name -Like '*version*'} | %{$_[0].Value}
Ada tidak perlu untuk mengingat setiap variabel. Hanya Mendapatkan-Variabel
cukup (dan "harus Ada sesuatu tentang versi").
Saya perlu memeriksa versi PowerShell dan kemudian menjalankan kode yang sesuai. Beberapa server kami menjalankan v5, dan lain-lain v4. Ini berarti bahwa beberapa fungsi, seperti kompres, mungkin atau mungkin tidak akan tersedia.
Ini adalah 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"
}
Ini adalah beberapa hasil pencarian untuk "file Batch mendapatkan versi powershell", jadi saya'd ingin memberikan contoh dasar bagaimana melakukan bersyarat mengalir dalam sebuah batch file, tergantung pada versi powershell
Generic contoh
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
)
Begitu banyak jawaban di sini. Saya pikir saya'd menempatkan saya di sini karena itu's cukup singkat, dan mengatakan kedua besar dan kecil versi bersama-sama.
$psMajorVer = $PSVersionTable.PSVersion.Major.ToString();$psMinorVer = $PSVersionTable.PSVersion.Minor.ToString();Write-Host "You have Powershell version " -NoNewline; Write-Host ($psMajorVer + "." + $psMinorVer);