web-dev-qa-db-fra.com

Déterminer la version du système d'exploitation, Linux et Windows à partir de Powershell

Comment déterminer le type de système d'exploitation (Linux, Windows) à l'aide de Powershell à partir d'un script?

Le ResponseUri n'est pas reconnu lorsque cette partie de mon script est exécutée sur un hôte Linux. 

$UrlAuthority = $Request.BaseResponse | Select-Object -ExpandProperty ResponseUri | Select-Object -ExpandProperty Authority

Je souhaite donc une instruction If pour déterminer le type de système d'exploitation qui ressemblerait à ceci:

If ($OsType -eq "Linux")
{
     $UrlAuthority = ($Request.BaseResponse).RequestMessage | Select-Object -ExpandProperty RequestUri | Select-Object -ExpandProperty Host
}
Else
     $UrlAuthority = $Request.BaseResponse | Select-Object -ExpandProperty ResponseUri | Select-Object -ExpandProperty Authority

Je pourrais utiliser Get-CimInstance Win32_OperatingSystem mais cela échouerait sous Linux car ce n’est pas reconnu. 

12
boomcubist

N'y a-t-il pas des variables d'environnement que vous pouvez visualiser sur les autres plateformes pour le système d'exploitation?

Get-ChildItem -Path Env:

En particulier, sous Windows au moins, il existe une variable d’environnement de système d’exploitation, de sorte que vous devriez pouvez le faire en utilisant $Env:OS


Depuis que quelque temps s'est écoulé et que le produit PowerShell Core est maintenant GA (6.0.*), vous pouvez déterminer plus précisément votre plate-forme en fonction des variables booléennes automatiques suivantes:

$IsMacOS
$IsLinux
$IsWindows
17
TheIncorrigible1

Depuis les versions PowerShell 6.1 sous Windows/Linux/OSX sont passées à GA, vous pouvez utiliser les nouvelles propriétés de $PSVersionTable, OS, Platform et GitCommitId

Update Dans la v6.0.0-beta.3, il y a quelques breaking changes:

  • Remplacez le paramètre de position pour powershell.exe de -Command par -File.

$PSVersionTable sur: 

Plate-forme Win32NT OS Microsoft Windows 10.0.15063

PS C:\Users\LotPings> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.1.0
PSEdition                      Core
GitCommitId                    6.1.0
OS                             Microsoft Windows 10.0.17134
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

Plate-forme Unix OS Linux (ubuntu)

PS /home/LotPings> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.1.0
PSEdition                      Core
GitCommitId                    6.1.0
OS                             Linux 4.15.0-34-generic #37-Ubuntu SMP Mon Aug 27 15:21:48 UTC 2018
Platform                       Unix
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

Plate-forme Unix OS Darwin

PS /Users/LotPings> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.1.0
PSEdition                      Core
GitCommitId                    6.1.0
OS                             Darwin 17.7.0 Darwin Kernel Version 17.7.0: Thu Jun 21 22:53:14 PDT 2018; root:xnu-4570.71.2~1/RE...
Platform                       Unix
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0
7
LotPings

En fait, la console PowerShell elle-même devrait ajouter des variables globales. Elles ne sont toutefois pas considérées comme des variables d'environnement. C'est pourquoi elles ne s'affichent pas lors de l'utilisation de dir env: pour obtenir une liste. Les variables spécifiques au système d'exploitation que je vois pour l'instant sont $IsLinux, IsMacOS et $IsWindows. Il s’agit au minimum de PowerShell version 6.0.0-rc et supérieure pour Mac/Linux.

Vous pouvez voir une liste de ce qui est disponible en utilisant simplement Get-Variable (lors d'une nouvelle session sans charger votre profil, si vous voulez seulement ce qui est intégré par défaut).

4
areyling

Quand vous devez seulement vérifier s'il s'agit de Windows ou de Linux, vous pourriez peut-être utiliser ceci (rapide et sale):

if ([System.Boolean](Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction SilentlyContinue))
{
    #windows
}
else
{
    #Not windows
}
2
Patrick

Pour PowerShell Core (Powershell Version 6.0+), vous pouvez utiliser Variables automatiques : $IsLinux, $IsMacOS et $IsWindows.

Par exemple,

if ($IsLinux) {
    Write-Host "Linux"
}
elseif ($IsMacOS) {
    Write-Host "macOS"
}
elseif ($IsWindows) {
    Write-Host "Windows"
}
0
zwcloud