我在 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
类似如下:
如果我使用-NoLogo
,此文本也会消失,但我仍然希望被告知。基本上,该-NoLogo
选项似乎只是给我一个全有或全无的选择,而我希望有第三个选择,“一些”。
那么,有什么方法可以做以下事情之一吗:
- 让 Powershell 在没有版本信息、链接和帮助文本的情况下启动,但在有新版本时仍会被告知?
- 或者...单独发现已经检测到新版本,比如是否存在环境变量或我可以手动调用的东西?
我有一些在这里运行的类似 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 "============================================================"
}