Réponses:
Utilisez $PSVersionTable.PSVersion
pour déterminer la version du moteur. Si la variable n'existe pas, il est sûr de supposer que le moteur est la version 1.0
.
Notez que $Host.Version
et (Get-Host).Version
ne sont pas fiables - ils reflètent uniquement la version de l'hôte, pas le moteur. PowerGUI, PowerShellPLUS, etc. sont tous des applications d'hébergement, et ils définiront la version de l'hôte pour refléter la version de leur produit - ce qui est tout à fait correct, mais pas ce que vous recherchez.
PS C:\> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
4 0 -1 -1
$PSVersionTable
est plus fiable et retourne $ PSVersion. Vous pouvez également utiliser $PSVersionTable.PSVersion
. Même si vous êtes connecté à distance à la machine exécutant une version différente ( invoke-command -computername myRemotePC -Credential foo {$host}
), il semble que $host
la version la plus basse convenue pour la sérialisation s'affiche. Alors $PSVersionTable
, la vraie version sera affichée. J'espère que cela aiderait quelqu'un ..
notepad $profile
et jeté function psver { $PSVersionTable; $PSVersionTable.PSVersion }
dedans. Un rechargement avec . $profile
et je peux simplement taper à psver
tout moment pour obtenir les informations de version détaillées et d'autres détails.
J'utiliserais Get-Host ou $ PSVersionTable . Comme le souligne Andy Schneider, $PSVersionTable
ne fonctionne pas dans la version 1; il a été introduit dans la version 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
n'est pas fiable - par exemple dans powergui, il renvoie la version hôte powergui qui n'est pas la même que la version du moteur powershell (ce qui est souhaité.)
Vous pouvez regarder la variable intégrée, $psversiontable
. S'il n'existe pas, vous avez V1. S'il existe, il vous donnera toutes les informations dont vous avez besoin.
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
Pour déterminer si PowerShell est installé, vous pouvez vérifier dans le registre l'existence de
HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install
et
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3
et, si elle existe, si la valeur est 1 (pour installé), comme détaillé dans le billet de blog Vérifiez si PowerShell est installé et la version .
Pour déterminer la version de PowerShell installée, vous pouvez vérifier les clés de registre
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion
et
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine\PowerShellVersion
Pour déterminer la version de PowerShell qui est installée à partir d'un script .ps1, vous pouvez utiliser la ligne unique suivante, comme détaillé sur PowerShell.com dans Quelle version de PowerShell suis-je en cours d'exécution .
$isV2 = test-path variable:\psversiontable
Le même site donne également une fonction pour renvoyer la version:
function Get-PSVersion {
if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}
Vous pouvez vérifier directement la version avec une seule ligne en appelant PowerShell en externe , comme à partir de l'invite de commandes
powershell -Command "$PSVersionTable.PSVersion"
Selon @psaul, vous pouvez réellement avoir une commande agnostique d'où elle vient (CMD, PowerShell ou Pwsh). Merci pour ça.
powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
J'ai testé et cela a fonctionné parfaitement sur CMD et PowerShell.
cmd
et powershell
en vain. Je m'attendais aussi au même comportement. :)
pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
fonctionne très bien.
Vous pouvez vérifier que la version de Windows PowerShell est installée en effectuant la vérification suivante:
Dans la console Windows PowerShell, tapez la commande suivante à l'invite de commandes, puis appuyez sur ENTRÉE:
Get-Host | Select-Object Version
Vous verrez une sortie qui ressemble à ceci:
Version
-------
3.0
http://www.myerrorsandmysolutions.com/how-to-verify-the-windows-powershell-version-installed/
La méthode de compatibilité descendante recommandée par Microsoft pour vérifier si PowerShell est installé et déterminer la version installée consiste à examiner deux clés de registre spécifiques. J'ai reproduit les détails ici au cas où le lien se romprait.
Selon la page liée:
En fonction de toute autre clé de registre, de la version de PowerShell.exe ou de l'emplacement de PowerShell.exe, il n'est pas garanti de fonctionner à long terme.
Pour vérifier si une version de PowerShell est installée, recherchez la valeur suivante dans le Registre:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
Pour vérifier si la version 1.0 ou 2.0 de PowerShell est installée, recherchez la valeur suivante dans le Registre:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
J'ai trouvé le moyen le plus simple de vérifier si l'installation était:
cmd
, puis OK)powershell
puis appuyez sur retour. Vous devriez ensuite obtenir l' PS
invite PowerShell :C:\Users\MyUser>powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.
PS C:\Users\MyUser>
Vous pouvez ensuite vérifier la version à partir de l'invite PowerShell en tapant $PSVersionTable.PSVersion
:
PS C:\Users\MyUser> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1
PS C:\Users\MyUser>
Tapez exit
si vous souhaitez revenir à l'invite de commandes (à exit
nouveau si vous souhaitez également fermer l'invite de commandes).
Pour exécuter des scripts, voir http://ss64.com/ps/syntax-run.html .
$host.version
est tout simplement faux / peu fiable. Cela vous donne la version de l'exécutable d'hébergement (powershell.exe, powergui.exe, powershell_ise.exe, powershellplus.exe, etc.) et non la version du moteur lui-même.
La version du moteur est contenue dans $psversiontable.psversion
. Pour PowerShell 1.0, cette variable n'existe pas, donc évidemment si cette variable n'est pas disponible, il est tout à fait sûr de supposer que le moteur est 1.0, évidemment.
Utilisation:
$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'}
}
Vous pouvez télécharger le script détaillé dans Comment déterminer la version PowerShell installée .
Le moyen le plus simple d'oublier cette page et de ne jamais y revenir est d'apprendre Get-Variable
:
Get-Variable | where {$_.Name -Like '*version*'} | %{$_[0].Value}
Il n'est pas nécessaire de se souvenir de chaque variable. C'est juste Get-Variable
assez (et "Il devrait y avoir quelque chose à propos de la version").
$PSVersionTable
Pour vérifier si PowerShell est installé, utilisez:
HKLM\Software\Microsoft\PowerShell\1 Install ( = 1 )
Pour vérifier si RC2 ou RTM est installé, utilisez:
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-00301) -- For RC2
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-04309) -- For RTM
Source: ce site Web .
Étant donné que la réponse la plus utile n'a pas abordé la partie si existe , j'ai pensé en donner une solution via une solution rapide et sale. Il repose sur le fait que PowerShell se trouve dans la variable d'environnement de chemin d'accès , ce qui est probablement ce que vous voulez. (Pointe du chapeau à la première réponse car je ne le savais pas.) Collez-le dans un fichier texte et nommez-le
Tester Powershell Version.cmd
ou similaire.
@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
J'avais besoin de vérifier la version de PowerShell, puis d'exécuter le code approprié. Certains de nos serveurs exécutent la v5 et d'autres la v4. Cela signifie que certaines fonctions, comme compresser, peuvent ou non être disponibles.
Voici ma solution:
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"
}
L'applet de commande ci-dessous renverra la version PowerShell.
$PSVersionTable.PSVersion.Major
$PSVersionTable
est une variable automatique; un objet. Ce n'est pas une applet de commande.
Ceci est le résultat de recherche supérieur pour "Fichier batch obtenir la version powershell", donc je voudrais fournir un exemple de base de la façon de faire un flux conditionnel dans un fichier batch en fonction de la version powershell
Exemple générique
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.
)
Exemple du monde réel
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
)
Vous pouvez également appeler la commande "host" à partir de la ligne de commande PowerShell. Il devrait vous donner la valeur de la $host
variable.
host
décide de Get-Host
. Quoi qu'il en soit, ce n'est pas un moyen fiable d'obtenir la version.
Extension de la réponse avec un opérateur de sélection:
Get-Host | select {$_.Version}
Get-Host
).