从Powershell

时间:2017-06-22 15:28:02

标签: linux windows powershell operating-system

如何在脚本中使用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上失败,因为它无法识别。

9 个答案:

答案 0 :(得分:21)

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

Get-ChildItem -Path Env:

特别是,至少在Windows上,有一个操作系统环境变量,因此应该能够通过$Env:OS

来实现这一点

由于已经过了一段时间并且 PowerShell Core 产品现在是GA(6.0.*),您可以根据以下自动布尔变量更准确地确定您的平台:

$IsMacOS
$IsLinux
$IsWindows

答案 1 :(得分:7)

由于Windows/Linux/OSX上的PowerShell版本6.1转到了GA,您可以使用$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操作系统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操作系统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

答案 2 :(得分:4)

实际上,PowerShell控制台本身应该添加全局变量 - 但它们并不被视为环境变量,这就是为什么在使用dir env:获取时不会出现这些变量的原因list。我现在看到的特定于操作系统的是$IsLinuxIsMacOS$IsWindows。对于Mac / Linux,这至少是PowerShell版本6.0.0-rc及更高版本。

您只需使用Get-Variable即可查看可用内容的列表(如果您只是想要内置默认设置,则可以在没有加载个人资料的新会话中)。

答案 3 :(得分:3)

当你只需要检查它是windows还是linux时,也许你可以使用它(快速和脏):

Nightmare.action("rightClick", function(name, options, parent, win, renderer, done) {
  parent.respondTo("rightClick", function(x, y, done) {
    win.webContents.sendInputEvent({
      type: "mousedown",
      x: x, y: y,
      modifiers: ["rightButtonDown", "right"],
      clickCount: 1
    });
    win.webContents.sendInputEvent({
      type: "mouseup",
      x: x, y: y,
    });
    setTimeout(function() {
      done();
    }, 25);
  });
  done();
}, function(x, y, done) {
  this.child.call("rightClick", x, y, done);
});

答案 4 :(得分:1)

在 PowerShell [Core] 版本 6 之前,这只能通过直接询问 .NET 来实现。这可以用一行来完成:

[System.Environment]::OSVersion.Platform

这将为 Windows NT(所有当前版本的 Windows)的任何后代返回 Win32NT 或为任何 *nix(包括 Mac、Linux 等)返回 Unix。如果它返回 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

— 请参阅Dave F's comment;我写了这个答案,因为这似乎是如何从评论中获得答案的。

答案 5 :(得分: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"
}

答案 6 :(得分:0)

基于上述内容,如果您只想检测是否在Windows下运行,并且想要在PowerShell和PowerShell Core中向前和向后兼容的脚本,则有以下内容:

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

答案 7 :(得分:0)

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)

答案 8 :(得分:0)

对于其他答案的注释中所述的问题,此功能可在Powershell的任何版本中使用。

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

$False为“ nix”。