web-dev-qa-db-fra.com

Déterminer la version installée de PowerShell

Comment puis-je déterminer quelle version de PowerShell est installée sur un ordinateur et même si elle est installée?

2272
MagicAndi

Utilisez $PSVersionTable.PSVersion pour déterminer la version du moteur. Si la variable n'existe pas, il est prudent de supposer que le moteur est de la version 1.0.

Notez que $Host.Version et (Get-Host).Version ne sont pas fiables - ils reflètent La version de l'hôte uniquement, pas le moteur. PowerGUI, PowerShellPLUS, etc. sont toutes des applications d'hébergement. Elles configurent la version de l'hôte en fonction de 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
3091
user156862

Je voudrais utiliser soit 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
400
Thomas Bratt

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 indiqué dans l'article 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 installée à partir d'un script .ps1, vous pouvez utiliser l'un des doublons suivants, comme indiqué en détail sur PowerShell.com dans Quelle version de PowerShell puis-je exécuter.

$isV2 = test-path variable:\psversiontable

Le même site donne aussi une fonction pour retourner la version:

function Get-PSVersion {
    if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}
91
MagicAndi

Vous pouvez regarder la variable intégrée, $psversiontable. Si cela 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    
88
Andy Schneider

Je veux juste ajouter mes 2 cents ici.

Vous pouvez vérifier directement la version avec une seule ligne en appelant powershell en externe}, comme avec l'invite de commande.

powershell -Command "$PSVersionTable.PSVersion"

MODIFIER:

Selon @psaul vous pouvez avoir en fait une commande agnostique d’où elle vient (CMD, Powershell ou Pwsh), merci pour cela.

powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" 

J'ai testé et cela a fonctionné parfaitement sur CMD et Powershell

 image

32
Patrick Bard

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 dans la commande Invite, puis appuyez sur Entrée:

    Get-Host | Version Select-Object

Vous verrez une sortie qui ressemble à ceci:

Version
-------
3.0

http://www.myerrorsandmysolutions.com/how-to-verify-the-windows-powershell-version-installed/

22
Eclipses

La méthode de compatibilité aval 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 serait rompu.

Selon la page liée:

En fonction d'autres clés de registre, de la version de PowerShell.exe ou de l'emplacement de PowerShell.exe, il n'est pas garanti que cela fonctionne à long terme.

Pour vérifier si toute version de PowerShell est installé, vérifiez la valeur suivante dans le registre:

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

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

  • Emplacement de la clé: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
  • Nom de la valeur: PowerShellVersion
  • Type de valeur: REG_SZ
  • Données de la valeur: <1.0 | 2.0>
19
Starfish

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

  • lancer une invite de commande (Démarrer, Exécuter, cmd, puis OK)
  • tapez powershell puis appuyez sur Entrée. Vous devriez alors obtenir l'invite PS de 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 saisissant $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 à la commande Invite (exit à nouveau si vous souhaitez également fermer la commande Invite).

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

11
SharpC

$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 not 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, aussi si cette variable n’est pas disponible, il est tout à fait sûr de supposer que le moteur est 1.0, bien entendu.

9
x0n

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é à partir de Comment déterminer la version de PowerShell installée.

9
Dale Chen

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 .

7
Daniel Elliott

Le moyen le plus simple d’oublier cette page et de ne jamais y revenir est d’apprendre le Get-Variable

Get-Variable | where {$_.Name -Like '*version*'} | %{$_[0].Value}

Il n'est pas nécessaire de se souvenir de chaque variable. Juste Get-Variable suffit (et "il devrait y avoir quelque chose à propos de la version"). 

6
Roman Pokrovskij

Étant donné que la réponse la plus utile ne traitait pas de la partie if existe, j'ai pensé que je la donnerais par le biais d'une solution simple et rapide. Il faut que PowerShell se trouve dans le chemin variable d’environnement qui correspond probablement à ce que vous voulez. (Le chapeau au sommet de la réponse car je ne le savais pas.) Collez ceci dans un fichier text et nommez-le.

Testez 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
6
Pecos Bill

La cmdlet ci-dessous renverra la version de PowerShell.

$PSVersionTable.PSVersion.Major
3
Venkatakrishnan

Je devais vérifier la version de PS et ensuite exécuter le code approprié. Certains de nos serveurs fonctionnent v5, d'autres v4. Cela signifie que certaines fonctions, telles que compresser, peuvent être disponibles ou non.

Ceci est ma solution: 

if ($PSVersionTable.PSVersion.Major -eq 5) {
    #Execute code available in 5, like Compress
    Write-Host "You are running version 5"
}
else {
    #Use a different process
    Write-Host "This is version $PSVersionTable.PSVersion.Major"
}
3
Atron Seige

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

2
Tylor Durden

Il s’agit du premier résultat de recherche correspondant à "La version du fichier batch sous PowerShell", aussi j'aimerais donner un exemple de base sur la façon de créer un flux conditionnel dans un fichier batch en fonction de la version de 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
)
1
Derpy

Habituellement, vous l'obtenez en utilisant le numéro majeur que vous pouvez obtenir comme ceci:

$PSVersionTable.PSVersion.Major
1
Jose Ortega

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

Get-Host | select {$_.Version}
1
HaBo

Essayez-le avec la commande suivante:

Get-Host

Vu ici

0
user2366586