从 Powershell 确定 OS 版本、Linux 和 Windows
Determine the OS version, Linux and Windows from Powershell
如何在脚本中使用 Powershell 确定 OS 类型(Linux、Windows)?
当我的脚本的这一部分在 Linux 主机上 运行 时,无法识别 ResponseUri。
$UrlAuthority = $Request.BaseResponse | Select-Object -ExpandProperty ResponseUri | Select-Object -ExpandProperty Authority
所以我想要一个 If
语句来确定看起来类似于此的 OS 类型:
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 上失败,因为它无法被识别。
OS 没有可以在其他平台上查看的环境变量吗?
Get-ChildItem -Path Env:
特别是,至少在 Windows 上,有一个 OS 环境变量,因此您 应该 能够通过使用 $Env:OS
.
由于一段时间过去了,PowerShell Core (v6) 产品现已正式发布(Core 品牌已从v7),您可以根据以下自动布尔变量更准确地确定您的平台:
$IsMacOS
$IsLinux
$IsWindows
当你只需要检查它是 windows 还是 linux 时,也许你可以使用这个(快速而肮脏):
if ([System.Boolean](Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction SilentlyContinue))
{
#windows
}
else
{
#Not windows
}
自从 Windows/Linux/OSX 上的 PowerShell 版本 6.1 正式发布后,您可以使用 $PSVersionTable
、OS
、Platform
和 GitCommitId
更新 v6.0.0-beta.3 有一些breaking changes
:
- 将 powershell.exe 的位置参数从 -Command 更改为 -File
$PSVersionTable
于:
平台Win32NT
OSMicrosoft 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
OSLinux (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
OSDarwin
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 控制台本身应该添加全局变量——尽管它们不被视为环境变量,这就是为什么在使用 dir env:
获取 list.The OS-specific 我现在看到的是 $IsLinux
、IsMacOS
和 $IsWindows
。对于 Mac/Linux.
,这至少是 PowerShell 版本 6.0.0-rc 及更高版本
您可以仅使用 Get-Variable
查看可用内容的列表(如果您只想要默认情况下 build-in 提供的内容,则在不加载您的个人资料的新会话中)。
对于 PowerShell Core (Powershell Version 6.0+), you can use Automatic Variables:$IsLinux
、$IsMacOS
和 $IsWindows
。
例如,
if ($IsLinux) {
Write-Host "Linux"
}
elseif ($IsMacOS) {
Write-Host "macOS"
}
elseif ($IsWindows) {
Write-Host "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
或者(在它的正上方有一个 "key - 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
这将 return Win32NT
任何从 Windows NT(Windows 的所有当前版本)后代的任何东西或 Unix
任何 *nix (包括 Mac、Linux、等等)。如果它 returns 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 documentation。
—
请参阅;我写这个答案是因为这似乎是如何从评论中获得答案的。
如果您没有安装最新的 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
如何在脚本中使用 Powershell 确定 OS 类型(Linux、Windows)?
当我的脚本的这一部分在 Linux 主机上 运行 时,无法识别 ResponseUri。
$UrlAuthority = $Request.BaseResponse | Select-Object -ExpandProperty ResponseUri | Select-Object -ExpandProperty Authority
所以我想要一个 If
语句来确定看起来类似于此的 OS 类型:
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 上失败,因为它无法被识别。
OS 没有可以在其他平台上查看的环境变量吗?
Get-ChildItem -Path Env:
特别是,至少在 Windows 上,有一个 OS 环境变量,因此您 应该 能够通过使用 $Env:OS
.
由于一段时间过去了,PowerShell Core (v6) 产品现已正式发布(Core 品牌已从v7),您可以根据以下自动布尔变量更准确地确定您的平台:
$IsMacOS
$IsLinux
$IsWindows
当你只需要检查它是 windows 还是 linux 时,也许你可以使用这个(快速而肮脏):
if ([System.Boolean](Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction SilentlyContinue))
{
#windows
}
else
{
#Not windows
}
自从 Windows/Linux/OSX 上的 PowerShell 版本 6.1 正式发布后,您可以使用 $PSVersionTable
、OS
、Platform
和 GitCommitId
更新 v6.0.0-beta.3 有一些breaking changes
:
- 将 powershell.exe 的位置参数从 -Command 更改为 -File
$PSVersionTable
于:
平台Win32NT
OSMicrosoft 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
OSLinux (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
OSDarwin
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 控制台本身应该添加全局变量——尽管它们不被视为环境变量,这就是为什么在使用 dir env:
获取 list.The OS-specific 我现在看到的是 $IsLinux
、IsMacOS
和 $IsWindows
。对于 Mac/Linux.
您可以仅使用 Get-Variable
查看可用内容的列表(如果您只想要默认情况下 build-in 提供的内容,则在不加载您的个人资料的新会话中)。
对于 PowerShell Core (Powershell Version 6.0+), you can use Automatic Variables:$IsLinux
、$IsMacOS
和 $IsWindows
。
例如,
if ($IsLinux) {
Write-Host "Linux"
}
elseif ($IsMacOS) {
Write-Host "macOS"
}
elseif ($IsWindows) {
Write-Host "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
或者(在它的正上方有一个 "key - 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
这将 return Win32NT
任何从 Windows NT(Windows 的所有当前版本)后代的任何东西或 Unix
任何 *nix (包括 Mac、Linux、等等)。如果它 returns 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 documentation。
—
请参阅
如果您没有安装最新的 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