如何在 powershell 中检测 Linux 或 macOS 或 Windows?

Posted

技术标签:

【中文标题】如何在 powershell 中检测 Linux 或 macOS 或 Windows?【英文标题】:How to detect Linux or macOS or Windows in powershell? 【发布时间】:2021-03-01 18:18:31 【问题描述】:

我在 bash 脚本中使用uname -s 来确定操作系统,它在 Linux、macOS 或 Windows 上运行时返回 Linux、Darwin 或 MINGW64_NT...。

EDIT0:我希望我的$PROFILE 脚本检测操作系统是在 Windows 上运行 PS(版本可能低于 6)还是在 Linux 上运行 PSv>=6。

我在 powershell 中找到了这个:

PS> [System.Environment]::OSVersion.Platform

在 Linux 上,它返回 Unix,在 64 位 Windows 上,它返回 Win32NT

我没有 macOS 可供我使用(还没有:))所以我不知道它在 macOS 上实际返回的内容。

EDIT1:UnixLinux 或 Windows32b 和 Windows64b 之间的这种方法似乎没有什么不同。

powershell 5.1 中检测操作系统还有哪些其他方法?

【问题讨论】:

5.1 不能在 macOS 或 Linux 上运行。还有其他获取操作系统信息的方法,显示的方法还不够吗? @DougMaurer 你是对的。在我的 Linux 上,我有 PSv7,但在我的 win7 上,我有 PSv5.1。但我希望我的$PROFILE 脚本能够检测操作系统是在 PS5 还是 PS7 上运行。 【参考方案1】:

问题是 Powershell 5.1。

在此详述:https://devblogs.microsoft.com/scripting/powertip-determine-your-version-of-powershell-and-host-operating-system/

更多细节在这里:Determine the OS version, Linux and Windows from Powershell

Powershell 5.1 没有能力也无法确定 Microsoft 环境之外的操作系统。最好的办法是使用 get-wmi 或 cim-sesssion

 windows 
 !windows

对于PowerShell Core (Powershell Version 6.0+),你可以使用自动变量:

$IsLinux
$IsMacOS
$IsWindows

6+ 你可以做一些事情:

   foreach ($i in $info) 
    
    if ($i -eq $IsLinux) 
        Write-Host $i is Linux
    
    elseif ($i -eq $IsMacOS) 
        Write-Host $i is This is a dirty, dirty Mac
    
    elseif ($i -eq $IsWindows) 
        Write-Host $i is Windows
    

   

使用 PowerShell 5.1 完成您所要求的工作根本不可能/可能不值得。

【讨论】:

我明白了。你循环的这个 $info 变量是什么? 我不懂get-wmicim-sesssion 命令。 PowerShell 和 cmd.exe 都无法识别 $info 变量将是设备名称或 IP 地址数组或来自 get-content 的类似变量 Get-WmiObject 您可以连接到Windows 计算机并获取信息。在 PowerShell 5.1 的情况下,您可以确定“所有 Windows”计算机,并向它们请求信息,然后确定哪些不是 Windows。但是,您无法确定除此之外,因为 Linux/macOS/etc 不支持 Get-WmiObject。问题是最近没有使用 Get-WmiObject 而是使用 Get-CimInstance。 Great examples of using Get-CimInstance

以上是关于如何在 powershell 中检测 Linux 或 macOS 或 Windows?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 powershell 或 cmd 计算屏幕数量

powershell检测注册表键值判断

如何设置PowerShell脚本定时执行

如何使用Powershell远程管理Linux服务器

执行 powershell 语句后检测错误

在 Linux 上进行远程处理时如何转发 Powershell.Exiting 事件