Déterminer la version PowerShell installée

2633

Comment puis-je déterminer quelle version de PowerShell est installée sur un ordinateur et, en fait, si elle est installée du tout?

MagicAndi
la source

Réponses:

3586

Utilisez $PSVersionTable.PSVersionpour 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.Versionet (Get-Host).Versionne 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
utilisateur156862
la source
2
@DanielCassidy - deux ans de retard à la fête, mais "certaines fonctionnalités ne sont pas disponibles de manière inexplicable" pourrait être due au fait que le framework .Net 3.5 Compact est installé au lieu de l'intégralité.
Dave Neeley
83
$PSVersionTableest 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 $hostla 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 ..
vulcan raven
16
Semble $ host.Version n'est pas un bon choix ... Si vous vous connectez à distance à une machine exécutant PowerShell 3, vous récupérez 1.0, car RemotingHost semble être la v1. Utiliser $ PSVersionTable renvoie correctement 3.
Danny Tuppeny
25
@Starfish La commande affichée lance Powershell à l'aide de l'invite de commande. La commande ne se contenterait-elle pas d'une erreur avec "powershell not found" si elle n'est pas installée?
jpmc26
9
Tellement fatigué de revenir ici pour cela que j'ai juste couru notepad $profileet jeté function psver { $PSVersionTable; $PSVersionTable.PSVersion }dedans. Un rechargement avec . $profileet je peux simplement taper à psvertout moment pour obtenir les informations de version détaillées et d'autres détails.
ADTC
434

J'utiliserais Get-Host ou $ PSVersionTable . Comme le souligne Andy Schneider, $PSVersionTablene 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
Thomas Bratt
la source
5
Merci! NB: Sur mon XP où j'ai mis à niveau manuellement à partir de v1 Powershell, les dossiers réels et les chemins de registre (trompeusement?!) Font référence à v1 et non à v2. C'est comme d'autres le précisent ici, mais c'était la raison pour laquelle j'étais si inquiet de l'avoir installé. Mon chemin est; C: \ WINDOWS \ system32 \ windowspowershell \ v1.0
AnneTheAgile
4
Si $ psversiontable n'existe pas, il est tout à fait sûr de supposer que vous êtes sur la version 1.0 - et hé hop, cela répond également à votre question. $host.versionn'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é.)
x0n
10
La réponse acceptée indique "... $ Host.Version et (Get-Host) .Version ne sont pas fiables - ils reflètent uniquement la version de l'hôte, pas le moteur" .
Peter Mortensen
100

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    
Andy Schneider
la source
97

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"}
}
MagicAndi
la source
4
Utile car sur un serveur Windows 2003, je n'ai pas pu trouver l'entrée du menu Démarrer pour PowerShell (elle était là mais pas évidente), mais la clé de registre a répondu à ma question.
Développeur holistique
7
Pour PowerScript 3.0, il semble y avoir une nouvelle entrée, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 (en plus de HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 ). L'endroit approprié dans ce cas pour obtenir la version semble être HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 \ PowerShellEngine \ PowerShellVersion (la valeur d'exemple est "3.0").
Peter Mortensen
49

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.

Image

Patrick Bard
la source
J'obtiens cette horrible erreur en essayant: "System.Collections.Hashtable.PSVersion: Le terme 'System.Collections.Hashtable.PSVersion' n'est pas reconnu comme le nom d'une applet de commande, d'une fonction, d'un fichier de script ou d'un programme exploitable. Vérifiez la l'orthographe du nom, ou si un chemin a été inclus, vérifiez que le chemin est correct et réessayez. ". Donc, ne fonctionne pas toujours
Gonmator
Je suis heureux que vous l'ayez souligné car il est bon de connaître les cas d'angle, mais je suppose que cela fonctionne toujours pour la majorité des gens.
Patrick Bard
@Gonmator, on pourrait penser que PowerShell se comporterait de la même manière avec cette commande, mais ce n'est malheureusement pas le cas. J'ai essayé de corriger la syntaxe pour qu'elle agnostiquement entre cmdet powershellen vain. Je m'attendais aussi au même comportement. :)
tresf
3
@tresf (et @Gonmator) vous POUVEZ l'exécuter de manière agnostique à partir de CMD, PowerShell ou même Pwsh (PS 6.0) mais vous devez utiliser ce formulaire: powershell -command "(Get-Variable PSVersionTable -ValueOnly) .PSVersion" (qui sera travailler dans tous les cas)
PSaul
Testé sur mac aussi. pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" fonctionne très bien.
tresf
38

Vous pouvez vérifier que la version de Windows PowerShell est installée en effectuant la vérification suivante:

  1. Cliquez sur Démarrer, sur Tous les programmes, sur Accessoires, sur Windows PowerShell, puis sur Windows PowerShell.
  2. 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/

Eclipses
la source
1
Vous supposez que powershell a été installé avec des options par défaut et que les raccourcis n'ont pas été supprimés du menu Démarrer. Mieux vaut utiliser le test de registre.
Xalorous
Je pense que si vous devez d'abord utiliser PowerShell, vous essayez de l'exécuter en standard, il doit être installé, puis si vous ne trouvez pas l'icône, essayez de le rechercher, alors vous essayez peut-être de l'exécuter à partir de l'invite de commandes. Je ne pense pas que vous partiez du registre.
Eclipses
6
La réponse acceptée indique "... $ Host.Version et (Get-Host) .Version ne sont pas fiables - ils reflètent uniquement la version de l'hôte, pas le moteur" .
Peter Mortensen
21

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:

  • Emplacement clé: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
  • Nom de la valeur: Installer
  • Type de valeur: REG_DWORD
  • Données de valeur: 0x00000001 (1

Pour vérifier si la version 1.0 ou 2.0 de PowerShell est installée, recherchez la valeur suivante dans le Registre:

  • Emplacement clé: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
  • Nom de la valeur: PowerShellVersion
  • Type de valeur: REG_SZ
  • Données de valeur: <1,0 | 2.0>
Étoile de mer
la source
5
Pour PowerShell 3.0, il semble y en avoir un nouveau, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 .
Peter Mortensen
11

J'ai trouvé le moyen le plus simple de vérifier si l'installation était:

  • exécuter une invite de commande (Démarrer, Exécuter cmd, puis OK)
  • tapez powershellpuis appuyez sur retour. Vous devriez ensuite obtenir l' PSinvite 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 exitsi vous souhaitez revenir à l'invite de commandes (à exitnouveau si vous souhaitez également fermer l'invite de commandes).

Pour exécuter des scripts, voir http://ss64.com/ps/syntax-run.html .

SharpC
la source
3
Comme pour la réponse acceptée, cela ne renvoie rien pour PowerShell 1.0. La méthode de registre est plus explicite.
Peter Mortensen
4
Si PowerShell n'était pas dans le chemin, cette version donnera une fausse impression qu'elle n'est pas installée. La méthode Registry fournit des informations complètes. Présence et version.
Xalorous
9

$host.versionest 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.

x0n
la source
9

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 .

Dale Chen
la source
8

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-Variableassez (et "Il devrait y avoir quelque chose à propos de la version").

Roman Pokrovskij
la source
8
Ce qui est le même que$PSVersionTable
orad
6
Vous recherchez la version PS? tapez $ PSVersion [tab] [enter]. Terminé. Je
n'ai
1
cela n'est vraiment utile que si l'on connaît très bien les astuces de tuyauterie utilisées. Aucun débutant ne pourra se souvenir que toute cette syntaxe est plus facile que de simplement se souvenir de $ PSVersionTable
Joseph Gabriel
1
Les gars, Get-Variable fonctionne bien seul (si tout ce dont vous avez besoin pour obtenir la version), la tuyauterie est juste une blague :) Je ne me souviens pas non plus de la syntaxe de la tuyauterie.
Roman Pokrovskij
7

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 .

Daniel Elliott
la source
7

É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
Pecos Bill
la source
4

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

L'applet de commande ci-dessous renverra la version PowerShell.

$PSVersionTable.PSVersion.Major
Venkatakrishnan
la source
2
$PSVersionTableest une variable automatique; un objet. Ce n'est pas une applet de commande.
Maximilian Burszley
1

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
)
Ridicule
la source
0

Vous pouvez également appeler la commande "host" à partir de la ligne de commande PowerShell. Il devrait vous donner la valeur de la $hostvariable.

Tylor Durden
la source
3
C'est à moitié faux. hostdécide de Get-Host. Quoi qu'il en soit, ce n'est pas un moyen fiable d'obtenir la version.
Maximilian Burszley
-1

Extension de la réponse avec un opérateur de sélection:

Get-Host | select {$_.Version}
HaBo
la source
7
La réponse acceptée indique "... $ Host.Version et (Get-Host) .Version ne sont pas fiables - ils reflètent uniquement la version de l'hôte, pas le moteur" .
Peter Mortensen
@PeterMortensen semble que ma réponse était avant la réponse acceptée
HaBo
2
@HaBo Que regardez-vous? La réponse acceptée est de 2009.
TylerH
@TylerH alors quoi? Je ne suis pas en train de suivre votre question. ma réponse dit clairement que c'est une extension de la réponse acceptée. c'est une version simplifiée.
HaBo
2
@HaBo Votre commentaire précédent se lit comme si vous justifiez votre réponse par le fait qu'elle a été postée avant la réponse acceptée, ce qui n'est pas du tout le cas. Votre réponse a été publiée 7 ans après la réponse acceptée et 6 ans après la réponse que la vôtre «prolonge»; en parlant de cela, votre réponse ne dit pas clairement que c'est une extension de la réponse acceptée (qui n'utilise même pas Get-Host).
TylerH