确定操作系统版本,Linux和Windows PowerShell的距离

问题描述 投票:15回答:5

如何确定使用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上失败。

linux windows powershell operating-system
5个回答
23
投票

不存在环境变量,您可以在其他平台上的操作系统查看?

Get-ChildItem -Path Env:

特别是,在Windows至少,有一个操作系统环境变量,所以你应该能够使用$Env:OS做到这一点


由于一段时间已经过去了,PowerShell核心产品是GA现在(6.0.*),可以更准确地确定你的平台基于以下自动布尔变量:

$IsMacOS
$IsLinux
$IsWindows

8
投票

由于PowerShell的版本6.1 Windows/Linux/OSX去GA你可以使用$PSVersionTableOSPlatformGitCommitId的新特性

更新V6.0.0中,beta.3有一些breaking changes

  • 从-Command更改位置参数为powershell.exe到-file

$PSVersionTable上:

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

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

5
投票

其实,应该有通过PowerShell控制台本身添加全局变量 - 它们不被认为是环境变量,虽然,这就是为什么使用dir env:获得list.The操作系统特定的那些我看到现在,当他们不露面是$IsLinuxIsMacOS$IsWindows。这是至少的PowerShell版本6.0.0-RC及以上的Mac / Linux操作系统。

你可以看到什么是可用的只用Get-Variable列表(在一个新的会话,而无需加载您的个人资料,如果你只是想什么来打造,在默认情况下)。


3
投票

如果你只需要检查它是否是Windows或Linux,也许你可以使用这个(快速和肮脏的):

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

0
投票

对于PowerShell Core(Powershell的版本6.0+),你可以使用Automatic Variables$IsLinux$IsMacOS$IsWindows

例如,

if ($IsLinux) {
    Write-Host "Linux"
}
elseif ($IsMacOS) {
    Write-Host "macOS"
}
elseif ($IsWindows) {
    Write-Host "Windows"
}
© www.soinside.com 2019 - 2024. All rights reserved.