it-swarm.com.de

Bestimmen Sie die Betriebssystemversion, Linux und Windows von Powershell

Wie kann ich den Betriebssystemtyp (Linux, Windows) mithilfe von Powershell aus einem Skript heraus ermitteln?

Der ResponseUri wird nicht erkannt, wenn dieser Teil meines Skripts auf einem Linux-Host ausgeführt wird. 

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

Ich möchte also eine If-Anweisung, um den Betriebssystemtyp zu bestimmen, der dem folgenden ähnelt:

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

Ich könnte Get-CimInstance Win32_OperatingSystem verwenden, aber es würde unter Linux fehlschlagen, da es nicht erkannt wird. 

12
boomcubist

Gibt es keine Umgebungsvariablen, die Sie auf den anderen Plattformen für das Betriebssystem anzeigen können?

Get-ChildItem -Path Env:

Insbesondere unter Windows gibt es zumindest eine Betriebssystemumgebungsvariable, sodass Sie sollte dies mithilfe von $Env:OS erreichen können.


Da einige Zeit vergangen ist und das Produkt PowerShell Core jetzt GA ist (6.0.*), können Sie Ihre Plattform anhand der folgenden automatischen booleschen Variablen genauer bestimmen:

$IsMacOS
$IsLinux
$IsWindows
17

Da die PowerShell-Versionen 6.1 unter Windows/Linux/OSX auf GA gingen, können Sie die neuen Eigenschaften $PSVersionTable, OS, Platform und GitCommitId verwenden.

Update In v6.0.0-beta.3 gibt es einige breaking changes:

  • Ändern Sie den Positionsparameter für powershell.exe von -Command in -File

$PSVersionTable am: 

Plattform 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

Plattform 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

Plattform Unix Betriebssystem 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

Tatsächlich sollten globale Variablen von der PowerShell-Konsole selbst hinzugefügt werden. Sie werden jedoch nicht als Umgebungsvariablen betrachtet. Daher werden sie nicht angezeigt, wenn Sie mit dir env: eine Liste abrufen. Die betriebssystemspezifischen Variablen, die ich derzeit sehe sind $IsLinux, IsMacOS und $IsWindows. Dies ist mindestens die PowerShell-Version 6.0.0-rc und höher für Mac/Linux.

Sie können eine Liste der verfügbaren Funktionen anzeigen, indem Sie einfach Get-Variable verwenden (in einer neuen Sitzung, ohne Ihr Profil zu laden, wenn Sie nur möchten, was standardmäßig integriert ist).

4
areyling

Wenn Sie nur prüfen müssen, ob es sich um Windows oder Linux handelt, können Sie dies (schnell und schmutzig) verwenden:

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

Darauf aufbauend möchten Sie nur feststellen, ob Sie unter Windows ausgeführt werden oder nicht, und Sie möchten ein Skript, das in PowerShell und PowerShell Core vorwärts- und rückwärtskompatibel ist:

if ($IsWindows -or $ENV:OS) {
    Write-Host "Windows"
} else {
    Write-Host "Not Windows"
}
0
MCattle

Für PowerShell Core (Powershell Version 6.0+) können Sie Automatic Variables : $IsLinux, $IsMacOS und $IsWindows verwenden.

Zum Beispiel,

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