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.
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
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
:
$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
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).
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
}
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"
}