Определить версию ОС, 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, так как он не распознается.

10 ответов

Решение

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

Get-ChildItem -Path Env:

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


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

$IsMacOS
$IsLinux
$IsWindows

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

Например,

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

Поскольку версии 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

До PowerShell [Core] версии 6 это было возможно только при прямом запросе .NET. Это можно сделать одной строкой:

      [System.Environment]::OSVersion.Platform

Это вернет либо Win32NTдля чего-либо, происходящего от Windows NT (все текущие версии Windows) или для чего-либо * nix (включая Mac, Linux и т. д.). Если он вернется Unix то вы, очевидно, используете v6 +, поэтому дополнительную информацию можно получить из $PSVersionTable.PSEdition, $PSVersionTable.Platform, а также $PSVersionTable.OS, и автоматические переменные тоже будут доступны: $IsLinux, $IsMacOs, а также .

Вот что у меня в profile.ps1 чтобы упростить это, установив $IsWindows:

      function Get-PSPlatform
{
    return [System.Environment]::OSVersion.Platform
}
switch (Get-PSPlatform)
{
    'Win32NT' { 
        New-Variable -Option Constant -Name IsWindows -Value $True -ErrorAction SilentlyContinue
        New-Variable -Option Constant -Name IsLinux  -Value $false -ErrorAction SilentlyContinue
        New-Variable -Option Constant -Name IsMacOs  -Value $false -ErrorAction SilentlyContinue
     }
}

Это работает во всех версиях PowerShell, поскольку это доступно в .NET, начиная с версии 1.x. Подробности см. В документации PlatformID .

- Пожалуйста , смотрите комментарий Дэйва объекта F ; Я написал этот ответ, потому что, похоже, так работает SO, чтобы получить ответ из комментария.

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

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

На самом деле, должны быть добавлены глобальные переменные самой консолью 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
}

Это будет работать в любой версии Powershell для проблем, описанных в комментариях к другим ответам.

$iswin = $PSVersionTable.Platform -match '^($|(Microsoft )?Win)'

С участием $False быть никс.

Еще несколько способов для Osx:

sw_vers -productVersion

10.12.6

Или (прямо над ним есть "ключ - os_version", но я не понимаю, как они связаны):

[xml]$xml = system_profiler SPSoftwareDataType -xml   
$xml.plist.array.dict.array.dict.string -match 'macos'  

macOS 10.12.6 (16G1510)

Если у вас не установлено последнее ядро ​​​​PowerShell, вы можете использовать небольшой блок сценариев, например:

      if ($PSVersionTable.PSVersion.Major -lt 6.0) {
    switch ($([System.Environment]::OSVersion.Platform)) {
        'Win32NT' { 
            New-Variable -Option Constant -Name IsWindows -Value $True -ErrorAction SilentlyContinue
            New-Variable -Option Constant -Name IsLinux -Value $false -ErrorAction SilentlyContinue
            New-Variable -Option Constant -Name IsMacOs -Value $false -ErrorAction SilentlyContinue
        }
    }
}
$script:IsLinuxEnv = (Get-Variable -Name "IsLinux" -ErrorAction Ignore) -and $IsLinux
$script:IsMacOSEnv = (Get-Variable -Name "IsMacOS" -ErrorAction Ignore) -and $IsMacOS
$script:IsWinEnv = !$IsLinuxEnv -and !$IsMacOSEnv
Другие вопросы по тегам