[英]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版已發布,您可以使用$PSVersionTable
、 OS
、 Platform
和GitCommitId
的新屬性
更新在 v6.0.0-beta.3 中有一些breaking changes
:
$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:
獲取列表時它們不會出現的原因。我看到的特定於操作系統的變量現在是$IsLinux
、 IsMacOS
和$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.