Определите версию ОС, Linux и Windows от Powershell

Как определить тип ОС (Linux, Windows) с помощью Powershell из script?

ResponseUri не распознается, когда эта часть моего script запускается на узле Linux.

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

Итак, я хочу, чтобы оператор If определял тип ОС, который будет выглядеть примерно так:

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

Я мог бы использовать Get-CimInstance Win32_OperatingSystem, но он не удался бы в Linux, поскольку он не был распознан.

Ответ 1

Нет ли переменных окружения, которые вы можете просматривать на других платформах для ОС?

Get-ChildItem -Path Env:

В частности, по крайней мере, в Windows есть переменная среды ОС, поэтому вы должны быть в состоянии сделать это с помощью $Env:OS


По прошествии некоторого времени продукт PowerShell Core теперь GA (6.0.*), поэтому вы можете более точно определить свою платформу на основе следующих автоматических логических переменных:

$IsMacOS
$IsLinux
$IsWindows

Ответ 2

Поскольку версии PowerShell 6.1 для Windows/Linux/OSX перешли на GA, вы можете использовать новые свойства $PSVersionTable, OS, Platform и GitCommitId

Обновление В v6.0.0-beta.3 есть некоторые breaking changes:

  • Измените позиционный параметр для powershell.exe с -Command на -File

$PSVersionTable на:

Платформа Win32NT ОС 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

Платформа Unix ОС 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

Платформа Unix ОС 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

Ответ 3

На самом деле, должны быть глобальные переменные, добавленные самой консолью PowerShell - они не считаются переменными среды, хотя, поэтому они не появятся при использовании dir env:, чтобы получить список. которые я вижу сейчас $IsLinux, IsMacOS и $IsWindows. Это, по крайней мере, версия PowerShell 6.0.0-rc и выше для Mac/Linux.

Вы можете увидеть список доступных с помощью только Get-Variable (в новом сеансе без загрузки вашего профиля, если вы просто хотите, что по умолчанию будет установлено).

Ответ 4

Когда вам нужно только проверить, являются ли это окнами или linux, возможно, вы могли бы использовать это (быстрое и грязное):

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

Ответ 5

Для PowerShell Core (Powershell Version 6. 0+) вы можете использовать Автоматические переменные: $IsLinux, $IsMacOS и $IsWindows.

Например,

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

Ответ 6

Основываясь на вышеизложенном, если вы хотите только определить, работаете ли вы под Windows или нет, и вам нужен сценарий, обеспечивающий прямую и обратную совместимость в PowerShell и PowerShell Core, выполните следующие действия:

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