TL;DR 和解决方法
多年后,这仍然是大多数用户的问题。我想我应该在这里给出一个彻底的解释。
两个问题:
-
Update-Help
需要 PowerShell 与以管理员身份运行
- 微软已经破坏了更新链接,这会在每个系统上引发错误。直到今天,您提到的某些模块仍然会抛出错误
您的第一个错误是明显且直接的,此输出直接包含在您的第一个错误输出中:
Access is denied. The command could not update Help topics for the Windows PowerShell core modules, or for any modules in the $pshome\Modules directory. To update these Help
topics, start Windows PowerShell by using the "Run as Administrator" command, and try running Update-Help again.
To suppress错误,但仍然下载您能够下载的所有内容,您可以运行以下命令(在通过以下方式启动的 PowerShell 控制台中)以管理员身份运行):
Update-Help -Verbose -Force -ErrorAction SilentlyContinue
OR
Update-Help -Verbose -Force -ErrorAction SilentlyContinue -ErrorVariable UpdateErrors
修复 PSReadLine
编辑(2021 年 9 月 1 日): PSReadLine
如果这是您要修复的模块之一,则有可用的具体说明:
Rename C:\Program Files\WindowsPowerShell\Modules\PSReadline
to C:\Program Files\WindowsPowerShell\Modules\PSReadLine
(这是因为它区分大小写,所以我们需要SPReadL一,不是 SPReadline).
不过,可能还需要更多。以下是其中一篇博客文章的完整演练:
- 关闭所有
powershell.exe
流程。然后重命名PSReadline
模块文件夹名称为PSReadLine
.
- Open an
powershell.exe
管理员权限的会话。
- Run
Remove-Module PSReadLine
删除自动加载的 PSReadLine 模块。
- Run
Import-Module PSReadLine
(使用大写的 PSReadLineL).
- 然后运行
Update-Help -Module PSReadLine -Force
引用的博客文章PSReadLine
更新修复:
- https://devblogs.microsoft.com/powershell/updating-help-for-the-psreadline-module/ https://devblogs.microsoft.com/powershell/updating-help-for-the-psreadline-module/
- https://devblogs.microsoft.com/powershell/updating-help-for-the-psreadline-module-in-windows-powershell-5-1/ https://devblogs.microsoft.com/powershell/updating-help-for-the-psreadline-module-in-windows-powershell-5-1/
解决方法/解决方案的说明
这是一个解释Update-Help -Verbose -Force -ErrorAction SilentlyContinue -ErrorVariable UpdateErrors
,它是如何工作的,以及为什么需要这样做,直到微软针对特定模块或针对Update-Help
itself.
来自帮助文档Update-Help https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/update-help?view=powershell-5.1,这就是需要管理员权限的原因:
更新帮助需要管理权限。
您必须是计算机上管理员组的成员才能更新 PowerShell Core 模块的帮助文件。
要下载或更新 PowerShell 安装目录 ($PSHOME\Modules) 中的模块(包括 PowerShell Core 模块)的帮助文件,请使用“以管理员身份运行”选项启动 PowerShell。例如:启动进程 powershell.exe -Verb RunAs。
您还可以使用 Windows PowerShell 集成脚本环境 (ISE) 中“帮助”菜单中的“更新 Windows PowerShell 帮助”菜单项来更新帮助文件。
更新 Windows PowerShell 帮助项运行不带参数的 Update-Help cmdlet。要更新 $PSHOME 目录中模块的帮助,请使用“以管理员身份运行”选项启动 Windows PowerShell ISE。
至于使用的参数:
-
-Force
意味着一些事情,也直接从文档中引用Update-Help https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/update-help?view=powershell-5.1:
指示此 cmdlet 不遵循每天一次的限制、跳过版本检查并下载超过 1 GB 限制的文件。
如果没有此参数,Update-Help 仅在每个 24 小时内运行一次。每个模块的下载限制为 1 GB 的未压缩内容,并且仅当帮助文件比计算机上的现有文件新时才会安装帮助文件。
每天一次的限制可以保护托管帮助文件的服务器,并使您可以将 Update-Help 命令添加到 PowerShell 配置文件中,而不会产生重复连接或下载的资源成本。
-
-Verbose
只是意味着它将提供一堵黄色文本墙,描述哪些模块正在尝试更新、正在解析的 URI 等。
-
-ErrorVariable UpdateErrors
将错误保存到可通过以下方式检索的变量中$UpdateErrors
多变的
-
-ErrorAction SilentlyContinue
意味着简单地忽略任何错误,并继续进行下一个可以更新的模块
你可能想知道为什么抑制错误被视为修复。这是因为:
- 如果您有一个运行此命令的脚本,并且您不希望该脚本因这些错误而退出。
- 它仅抑制无法下载帮助的模块的错误,并且仍然下载所有其他可以下载的模块的帮助。
- 如果仍然希望调查错误,那么至少可以在
$UpdateErrors
变量,可以保存到文件或以其他方式处理。
- 为了真正解决抛出的错误,微软必须采取一些措施来修复他们自己的帮助文档端点。
等等,但为什么这是微软的问题呢?
以下是最新 Windows 10 系统(截至 2019 年第 4 季度/2020 年第 1 季度)的示例:
$PSVersionTable
Name Value
---- -----
PSVersion 5.1.18362.145
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.145
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
Get-WmiObject win32_operatingsystem | select Caption, Version
Caption Version
------- -------
Microsoft Windows 10 Pro 10.0.18363
对于那些在 Windows 上使用 PowerShell 的新手和经验丰富的用户,请参阅这些Update-Help
更新帮助文档的第一步中的错误是一个主要的障碍和混乱点。大多数错误并不是用户端的某种错误配置,但不幸的是,它一直是过去几年命令输出的默认和持续期望。
是的,解决方法命令有效。但是,如果人们通过抑制错误输出并继续运行内置命令,这将是一种糟糕的客户体验(如果发生其他错误,这可能不是教导人们的最佳实践?)。抑制错误是人们唯一要做的事情。即使从 2016 年开始,它也是得票最高的答案:
- PowerShell (5)Update-Help 安装 Windows 10 周年更新后抛出错误 https://social.technet.microsoft.com/Forums/de-DE/fa1da35e-46a8-42de-b5c4-ac423c8d3d39/powershell-5updatehelp-throws-error-after-installing-windows-10-anniversary-update?forum=winserverpowershell
请注意,标记的accepted答案(应该NOT是接受的答案)有关的更新错误HelpInfoUri
这里说:
我认为您需要联系微软支持人员来解决这个问题。
问题出在您的机器及其安装上,您需要获得支持来帮助您。我认为我们唯一可以提出的建议就是重新安装Windows。 (!!)
疯狂的事情!如果出现此错误,请勿重新安装!我希望用户没有因为以下原因而重新安装HelpInfoUri
错了。
正如所说SamB 在这个 GitHub 问题中,直接专注于尝试解决这个持续存在的问题 https://github.com/MicrosoftDocs/windows-powershell-docs/issues/139#issuecomment-493263344, the HelpInfoURI
Microsoft 在其中设定的值PowerShell 清单文件 https://learn.microsoft.com/en-us/powershell/scripting/developer/module/how-to-write-a-powershell-module-manifest?view=powershell-7有过错:
Well, WindowsUpdateProvider 的模块清单 https://gist.github.com/SamB/da46329bf616f47faf5ce0224f166e46在这台机器上没有给出任何超出“Microsoft Corporation”的归属,但它确实指定了一个HelpInfoUri
of https://go.microsoft.com/fwlink/?linkid=390794 https://go.microsoft.com/fwlink/?linkid=390794,所以实际上没有必要费力地弄清楚模块来自哪里,并以某种方式证明这需要向 WindowsUpdateProvider 发布补丁——只需将重定向指向适当的地方即可。
如果您在系统上运行以下命令Update-Help
出现错误,您应该看到输出:
Import-Module WindowsUpdateProvider
Get-Module WindowsUpdateProvider | select HelpInfoURI,Version
HelpInfoUri Version
----------- -------
https://go.microsoft.com/fwlink/?linkid=390794 1.0.0.2
使用源模块清单Windows更新提供程序,例如,位于此处:
C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\WindowsUpdateProvider\WindowsUpdateProvider.psd1
微软绝对可以将链接重定向到一个有效的HelpInfoUri
,这意味着客户端的零变化。
顺便说一句,人们使用-ErrorAction SilentlyContinue
通常情况下,其他几个模块的帮助已被破坏。截至今天,这些在标准 Windows 10 桌面上已被破坏:
$TestModules = @("Microsoft.PowerShell.ODataUtils", "Microsoft.PowerShell.Operation.Validation", "UEV", "Whea", "WindowsDeveloperLicense", "defender", "configdefender", "appvclient")
Import-Module $TestModules
$BorkedHelp = Get-Module $TestModules | select Name, Version, HelpInfoUri
$BorkedHelp
Name Version HelpInfoUri
---- ------- -----------
appvclient 1.0.0.0 https://go.microsoft.com/fwlink/?LinkId=403112
configdefender 1.0 https://go.microsoft.com/fwlink/?linkid=390762
defender 1.0 https://go.microsoft.com/fwlink/?linkid=390762
Microsoft.PowerShell.ODataUtils 1.0 https://go.microsoft.com/fwlink/?LinkId=509916
Microsoft.PowerShell.Operation.Validation 1.0.1 https://go.microsoft.com/fwlink/?LinkId=808399
UEV 2.1.639.0 https://go.microsoft.com/fwlink/?LinkId=826061
Whea 2.0.0.0 https://go.microsoft.com/fwlink/?linkid=390848
WindowsDeveloperLicense 1.0.0.0 https://go.microsoft.com/fwlink/?linkid=285578
foreach ($uri in $BorkedHelp.helpinfouri) {Invoke-WebRequest $uri}
欢迎来到红色的海洋404 - File or directory not found.
错误,所有端点都需要重定向。目前,一些端点已经被打破多年,而另一些端点的打破时间可能更少。
这些应该可以由微软修复,无论他们有什么关于链接转发的工具,除非他们更新模块清单本身以指向新工作HelpInfoURI
端点,这对所有用户来说都是不太友好的选择。
如果微软的问题是默认情况下没有可下载的文档,并且链接可能是自动生成的保留,供以后有文档下载时使用,那么它们至少应该有一个最低限度的链接HelpInfoURI
端点而不是损坏的端点。
帮助让 Microsoft 意识到
Users who run into this problem, and found this explanation helpful, should visit this issue on GitHub: MicrosoftDocs/windows-powershell-docs: Update-Help fails for WindowsUpdateProvider https://github.com/MicrosoftDocs/windows-powershell-docs/issues/139
编辑(2021 年 9 月 1 日):上述问题已被关闭,并且 Microsoft 不再使用 UserVoice 进行反馈(在问题关闭时被提及为适当的位置)。看起来最好的选择是去Microsoft 技术社区:PowerShell https://techcommunity.microsoft.com/t5/powershell/ct-p/WindowsPowerShell,由于 Microsoft 支持文档中有关 UserVoice 的通知:
注意:我们将在 2021 日历年中逐个产品地放弃 UserVoice 反馈网站。我们将利用第一方解决方案来获取客户反馈。参考 https://support.microsoft.com/en-us/office/uservoice-pages-430e1a78-e016-472a-a10f-dc2a3df3450a
如果任何有问题的 PowerShell 模块都有公共存储库,那么这些模块将是适当的位置,否则会引发有关损坏的问题Update-Help
功能。如果它是 Microsoft 产品附带的 PowerShell 模块,则需要通过某种向产品本身报告的方式提出问题。
另一种修复方法
对于任何已知的帮助文档端点已损坏的 PowerShell 模块,您还可以注释掉HelpInfoURI
PowerShell 清单中的值。Update-Help
仅尝试下载模块的更新HelpInfoURI
有一个价值。这可能有助于了解是否由于端点问题(例如HelpInfoURI
托管您自己的模块文档)。