Определение версии ОС, Linux и Windows из Powershell

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

ResponseUri не распознается, когда эта часть моего скрипта запускается на хосте 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, поскольку он не распознается.

4 ответов


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

Get-ChildItem -Path Env:

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


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

$IsMacOS
$IsLinux
$IsWindows

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

обновление в V6.0.0-бета.3 есть некоторые breaking changes:

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

$PSVersionTable on:

платформа 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
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

платформа 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

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

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


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

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