Определить версию ОС, 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