简体   繁体   English

从 Powershell 确定操作系统版本、Linux 和 Windows

[英]Determine the OS version, Linux and Windows from Powershell

How can I determine the OS type, (Linux, Windows) using Powershell from within a script?如何在脚本中使用 Powershell 确定操作系统类型(Linux、Windows)?

The ResponseUri isn't recognised when this part of my script is ran on a Linux host.当我的脚本的这一部分在 Linux 主机上运行时,无法识别 ResponseUri。

$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语句来确定类似于此的操作系统类型:

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.我可以使用Get-CimInstance Win32_OperatingSystem但它在 Linux 上会失败,因为它无法识别。

Aren't there environment variables you can view on the other platforms for the OS?没有可以在操作系统的其他平台上查看的环境变量吗?

Get-ChildItem -Path Env:

Particularly, on Windows at least, there's an OS environment variable, so you should be able to accomplish this by using $Env:OS .特别是,至少在 Windows 上,有一个操作系统环境变量,因此您应该能够通过使用$Env:OS来完成此操作。


Since some time has passed and the PowerShell Core (v6) product is GA now (the Core branding has been dropped as of v7), you can more accurately determine your platform based on the following automatic boolean variables:由于一段时间过去了, PowerShell Core (v6) 产品现已正式发布(从 v7 开始, Core品牌已被删除),您可以根据以下自动布尔变量更准确地确定您的平台:

$IsMacOS
$IsLinux
$IsWindows

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由于Windows/Linux/OSX上的 PowerShell 6.1版已发布,您可以使用$PSVersionTableOSPlatformGitCommitId的新属性

Update In v6.0.0-beta.3 there are some breaking changes :更新在 v6.0.0-beta.3 中有一些breaking changes

  • Change positional parameter for powershell.exe from -Command to -File将 powershell.exe 的位置参数从 -Command 更改为 -File

$PSVersionTable on : $PSVersionTable上:

Platform Win32NT OS Microsoft Windows 10.0.15063平台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

Platform Unix OS Linux (ubuntu)平台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平台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

For PowerShell Core (Powershell Version 6.0+), you can use Automatic Variables : $IsLinux , $IsMacOS and $IsWindows .对于PowerShell Core (Powershell 版本 6.0+),您可以使用自动变量$IsLinux$IsMacOS$IsWindows

For example,例如,

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

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 .实际上,PowerShell 控制台本身应该添加全局变量——尽管它们不被视为环境变量,这就是为什么在使用dir env:获取列表时它们不会出现的原因。我看到的特定于操作系统的变量现在是$IsLinuxIsMacOS$IsWindows This is of at least PowerShell version 6.0.0-rc and above for Mac/Linux.这至少是适用于 Mac/Linux 的 PowerShell 版本 6.0.0-rc 及更高版本。

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).您可以仅使用Get-Variable来查看可用内容的列表(如果您只想要默认内置的内容,则在不加载配置文件的新会话中)。

When you only have to check if it is windows or linux, maybe you could use this (quick and dirty):当你只需要检查它是 windows 还是 linux 时,也许你可以使用这个(又快又脏):

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

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:在上述基础上,如果您只想检测您是否在 Windows 下运行,并且您想要一个在 PowerShell 和 PowerShell Core 中向前和向后兼容的脚本,有这个:

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

Some more ways for Osx: 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):或者(在它的正上方有一个“键 - os_version”,但我看不出它们之间的关系):

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

macOS 10.12.6 (16G1510)

This will work in any version of Powershell for the problems described in the comments on other answers.对于其他答案的评论中描述的问题,这将适用于任何版本的 Powershell。

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

With $False being 'nix. $False是'nix。

Prior to PowerShell [Core] version 6, this was only possible by asking .NET directly.在 PowerShell [Core] 版本 6 之前,这只能通过直接询问 .NET 来实现。 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.).这将返回Win32NT用于任何继承自 Windows NT(所有当前版本的 Windows)或Unix的任何 *nix(包括 Mac、Linux 等)。 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 .如果它返回Unix那么您显然正在运行 v6+,因此可以从$PSVersionTable.PSEdition$PSVersionTable.Platform$PSVersionTable.OS ,并且自动变量也将可用: $IsLinux$IsMacOs 、和$IsWindows

Here's what I have in my profile.ps1 to make this easier by setting $IsWindows :这是我在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
     }
}

This works in all versions of PowerShell as this has been available from .NET since version 1.x.这适用于所有版本的 PowerShell,因为它从 1.x 版开始可从 .NET 获得。 See PlatformID documentation for details.有关详细信息,请参阅PlatformID 文档

— Please see Dave F's comment ; — 请参阅Dave F 的评论 I wrote this answer because that seems how SO works to get an answer promoted from a comment.我写了这个答案,因为这似乎是如何从评论中获得答案的。

I you don't have the latest PowerShell core installed you can use a small scriptblock like:如果您没有安装最新的 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM