Yanıtlar:
$PSVersionTable.PSVersion
Motor 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.Version
ve (Get-Host).Version
gü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
$PSVersionTable
daha 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 $PSVersionTable
gerçek sürümü gösterecektir. Birine yardımcı olacağını umuyoruz ..
notepad $profile
ve içine atıldım function psver { $PSVersionTable; $PSVersionTable.PSVersion }
. Bir yeniden yükleme . $profile
ve ben sadece psver
detaylı sürüm bilgisi ve diğer ayrıntıları almak için her zaman yazabilirsiniz .
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
$host.version
gü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.)
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
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"}
}
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ı.
cmd
ve işe yaramayacak şekilde düzeltmek için girişimde bulundum powershell
. Ben de aynı davranışı beklerdim. :)
pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
harika çalışıyor.
Aşağıdaki denetimi tamamlayarak Windows PowerShell sürümünün yüklü olduğunu doğrulayabilirsiniz:
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/
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,:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\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:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
Yüklü olup olmadığını kontrol etmenin en kolay yolunu buldum:
cmd
, sonra Tamam)powershell
geri dön tuşuna basın. Daha sonra PowerShell PS
istemini 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 exit
istemi komutuyla (geri dönmek istiyorsanız exit
siz de yakın komuta istemi istiyorum tekrar varsa).
Komut dosyalarını çalıştırmak için bkz. Http://ss64.com/ps/syntax-run.html .
$host.version
sadece 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.
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 .
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-Variable
yeter (ve "Sürüm hakkında bir şey olmalı").
$PSVersionTable
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 .
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
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"
}
Aşağıdaki cmdlet, PowerShell sürümünü döndürür.
$PSVersionTable.PSVersion.Major
$PSVersionTable
bir otomatik değişkendir; bir obje. Bir cmdlet değil.
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
)
PowerShell komut satırından "host" komutunu da çağırabilirsiniz. Size $host
değişkenin değerini vermelidir .
host
karar verir Get-Host
. Ne olursa olsun, sürümü almanın güvenilir bir yolu değildir.
Cevabı belirli bir operatörle genişletme:
Get-Host | select {$_.Version}
Get-Host
) açıkça belirtmez .