如果我使用带有“-NoLogo”的 Powershell 来隐藏“logo”文本,是否可以告知/确定 Powershell 是否检测到我正在运行旧版本的 pwsh?

如果我使用带有“-NoLogo”的 Powershell 来隐藏“logo”文本,是否可以告知/确定 Powershell 是否检测到我正在运行旧版本的 pwsh?

我在 Windows 10/11 上使用 Powershell 7(核心?),启动 Windows 终端时收到这种输出:

PowerShell 7.2.3
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

Loading personal and system profiles took 1860ms.

我知道我可以配置 Windows 终端以使用-NoLogo命令行参数启动 Powershell,从而隐藏这些信息。

然而如果 Powershell 发现有新版本,它会将如下内容嵌入到同一文本中:

A new Powershell stable release is available: v7.2.4
Upgrade now, or check out the release page at:
  https://aka.ms/Powershell-Release?tag=v7.2.4

类似如下:

Powershell 更新可用

如果我使用-NoLogo,此文本也会消失,但我仍然希望被告知。基本上,该-NoLogo选项似乎只是给我一个全有或全无的选择,而我希望有第三个选择,“一些”。

那么,有什么方法可以做以下事情之一吗:

  1. 让 Powershell 在没有版本信息、链接和帮助文本的情况下启动,但在有新版本时仍会被告知?
  2. 或者...单独发现已经检测到新版本,比如是否存在环境变量或我可以手动调用的东西?

我有一些在这里运行的类似 init 的脚本,所以我可以轻松地在那里嵌入代码,但我不想增加 https 调用的开销来找出这一点。

作为参考,但我怀疑这是否相关,Windows 终端中的配置如下:

{
    "guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
    "hidden": false,
    "name": "PowerShell",
    "source": "Windows.Terminal.PowershellCore"
},

我知道我必须将source参数更改为commandline或类似才能传递参数,但我可以处理。

答案1

如果您愿意牺牲一些性能来换取 HTTP 调用,那么您可以使用 winget:

winget list microsoft.powershell

如果有可用更新,输出将包含名为的列Available。如果安装的版本是最新的,您将只看到列名称、ID、版本和来源。

答案2

我最终使用了@Berend 的关于使用编写脚本的评论winget list microsoft.powershell,该脚本每天仅检索一次可用版本,但每次执行脚本时都会进行比较。

免责声明:我是一个真正的 Powershell 新手,因此以下脚本中可能有很多不是惯用的最佳方法,或者只是容易出错。我希望得到反馈以改进!

$datafilepath = [System.IO.Path]::Combine([System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Path), "Check-PowershellUpgrade-Data.json")
if (Test-Path $datafilepath) {
    $data = Get-Content $datafilepath | ConvertFrom-Json
} else {
    $data = @{ "date" = "0001-01-01"; "version" = "0.0.0.0" }
}
$today = Get-Date -Format "yyyy-MM-dd"

if ($data.date -ne $today) {
    $lines = (winget list microsoft.powershell)
    foreach ($line in $lines) {
        $newversion = [regex]::match($line, "(\d+\.\d+\.\d+\.\d+)\s+(\d+\.\d+\.\d+\.\d+)").Groups[2].Value
        if ($newversion) {
            break
        }
    }
    if ($newversion) {
        $data.date = $today
        $data.version = $newversion
        $json = ConvertTo-Json $data
        Set-Content -Path $datafilepath -Value $json
    }
}

$currentversion = (Get-Host).Version
$majorMinorBuildOnly = [regex]::match($data.version, "^(\d+\.\d+\.\d+)\.\d+$").Groups[1].Value
if ($majorMinorBuildOnly) {
    $installableversion = [System.Version]::Parse($majorMinorBuildOnly)
} else {
    $installableversion = [System.Version]::Parse($data.version)
}
if ($currentversion -lt $installableversion) {
    Write-Host "============================================================"
    Write-Host "A new PowerShell stable release is available: v$installableversion"
    Write-Host "Upgrade now, or check out the release page at:"
    Write-Host "  https://aka.ms/PowerShell-Release?tag=v$installableversion"
    Write-Host "============================================================"
}

相关内容