簡體   English   中英

從 Powershell 確定操作系統版本、Linux 和 Windows

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

如何在腳本中使用 Powershell 確定操作系統類型(Linux、Windows)?

當我的腳本的這一部分在 Linux 主機上運行時,無法識別 ResponseUri。

$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 上會失敗,因為它無法識別。

沒有可以在操作系統的其他平台上查看的環境變量嗎?

Get-ChildItem -Path Env:

特別是,至少在 Windows 上,有一個操作系統環境變量,因此您應該能夠通過使用$Env:OS來完成此操作。


由於一段時間過去了, PowerShell Core (v6) 產品現已正式發布(從 v7 開始, Core品牌已被刪除),您可以根據以下自動布爾變量更准確地確定您的平台:

$IsMacOS
$IsLinux
$IsWindows

由於Windows/Linux/OSX上的 PowerShell 6.1版已發布,您可以使用$PSVersionTableOSPlatformGitCommitId的新屬性

更新在 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 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

平台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

對於PowerShell Core (Powershell 版本 6.0+),您可以使用自動變量$IsLinux$IsMacOS$IsWindows

例如,

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

實際上,PowerShell 控制台本身應該添加全局變量——盡管它們不被視為環境變量,這就是為什么在使用dir env:獲取列表時它們不會出現的原因。我看到的特定於操作系統的變量現在是$IsLinuxIsMacOS$IsWindows 這至少是適用於 Mac/Linux 的 PowerShell 版本 6.0.0-rc 及更高版本。

您可以僅使用Get-Variable來查看可用內容的列表(如果您只想要默認內置的內容,則在不加載配置文件的新會話中)。

當你只需要檢查它是 windows 還是 linux 時,也許你可以使用這個(又快又臟):

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

在上述基礎上,如果您只想檢測您是否在 Windows 下運行,並且您想要一個在 PowerShell 和 PowerShell Core 中向前和向后兼容的腳本,有這個:

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

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。

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

$False是'nix。

在 PowerShell [Core] 版本 6 之前,這只能通過直接詢問 .NET 來實現。 這可以通過一行來完成:

[System.Environment]::OSVersion.Platform

這將返回Win32NT用於任何繼承自 Windows NT(所有當前版本的 Windows)或Unix的任何 *nix(包括 Mac、Linux 等)。 如果它返回Unix那么您顯然正在運行 v6+,因此可以從$PSVersionTable.PSEdition$PSVersionTable.Platform$PSVersionTable.OS ,並且自動變量也將可用: $IsLinux$IsMacOs 、和$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
     }
}

這適用於所有版本的 PowerShell,因為它從 1.x 版開始可從 .NET 獲得。 有關詳細信息,請參閱PlatformID 文檔

— 請參閱Dave F 的評論 我寫了這個答案,因為這似乎是如何從評論中獲得答案的。

如果您沒有安裝最新的 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