'Determine the OS version, Linux and Windows from Powershell
How can I determine the OS type, (Linux, Windows) using Powershell from within a script?
The ResponseUri isn't recognised when this part of my script is ran on a Linux host.
$UrlAuthority = $Request.BaseResponse | Select-Object -ExpandProperty ResponseUri | Select-Object -ExpandProperty Authority
So I want an If statement to determine the OS type that would look similar to this:
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
I could use Get-CimInstance Win32_OperatingSystem but it would fail on Linux as it's not recognised.
Solution 1:[1]
Since the PowerShell versions 6.1 on Windows/Linux/OSX went to GA you can use the new properties of $PSVersionTable, OS, Platform and GitCommitId
Update In v6.0.0-beta.3 there are some breaking changes:
- Change positional parameter for powershell.exe from -Command to -File
$PSVersionTable on :
Platform 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
Platform 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
Platform 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
Solution 2:[2]
For PowerShell Core (Powershell Version 6.0+), you can use Automatic Variables: $IsLinux, $IsMacOS and $IsWindows.
For example,
if ($IsLinux) {
Write-Host "Linux"
}
elseif ($IsMacOS) {
Write-Host "macOS"
}
elseif ($IsWindows) {
Write-Host "Windows"
}
Solution 3:[3]
Actually, there should be global variables added by the PowerShell console itself--they're not considered environment variables though, which is why they wouldn't show up when using dir env: to get a list.The OS-specific ones I see for now are $IsLinux, IsMacOS and $IsWindows. This is of at least PowerShell version 6.0.0-rc and above for Mac/Linux.
You can see a list of what's available by using just Get-Variable (in a fresh session without loading your profile, if you just want what comes build-in by default).
Solution 4:[4]
Building on the above, if you only want to detect whether or not you're running under Windows, and you want a script that's forwards and backwards compatible in PowerShell and PowerShell Core, there's this:
if ($IsWindows -or $ENV:OS) {
Write-Host "Windows"
} else {
Write-Host "Not Windows"
}
Solution 5:[5]
When you only have to check if it is windows or linux, maybe you could use this (quick and dirty):
if ([System.Boolean](Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction SilentlyContinue))
{
#windows
}
else
{
#Not windows
}
Solution 6:[6]
Some more ways for Osx:
sw_vers -productVersion
10.12.6
Or (there's a "key - os_version" right above it, but I don't see how they relate):
[xml]$xml = system_profiler SPSoftwareDataType -xml
$xml.plist.array.dict.array.dict.string -match 'macos'
macOS 10.12.6 (16G1510)
Solution 7:[7]
This will work in any version of Powershell for the problems described in the comments on other answers.
$iswin = $PSVersionTable.Platform -match '^($|(Microsoft )?Win)'
With $False being 'nix.
Solution 8:[8]
Prior to PowerShell [Core] version 6, this was only possible by asking .NET directly. This can be done with one line:
[System.Environment]::OSVersion.Platform
This will return either Win32NT for anything descended from Windows NT (all current versions of Windows) or Unix for anything *nix (including Mac, Linux, &c.). If it returns Unix then you're obviously running v6+, so further information can be had from $PSVersionTable.PSEdition, $PSVersionTable.Platform, and $PSVersionTable.OS, and the automatic variables will be available too: $IsLinux, $IsMacOs, and $IsWindows.
Here's what I have in my profile.ps1 to make this easier by setting $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
}
}
This works in all versions of PowerShell as this has been available from .NET since version 1.x. See PlatformID documentation for details.
— Please see Dave F's comment; I wrote this answer because that seems how SO works to get an answer promoted from a comment.
Solution 9:[9]
I you don't have the latest PowerShell core installed you can use a small scriptblock like:
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
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | zwcloud |
| Solution 3 | areyling |
| Solution 4 | MCattle |
| Solution 5 | Patrick |
| Solution 6 | js2010 |
| Solution 7 | Hashbrown |
| Solution 8 | |
| Solution 9 | alainQtec |
