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