设置:
- Windows 10 2004 更新至最新稳定更新
- powershell 7.0.3
- PSWindowsUpdate 2.2.0.2
总结:我正在运行上述设置,直到运行“Get-Command -module PSWindowsUpdate”才能运行 PSWindowsUpdate 中可用的命令。
我认为最好用一个例子来解释。
> Install-WindowsUpdate
Install-WindowsUpdate: The term 'Install-WindowsUpdate' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
> Get-Command -module PSWindowsUpdate
CommandType Name Version Source
----------- ---- ------- ------
Alias Clear-WUJob 2.2.0.2 PSWindowsUpdate
Alias Download-WindowsUpdate 2.2.0.2 PSWindowsUpdate
Alias Get-WUInstall 2.2.0.2 PSWindowsUpdate
Alias Get-WUList 2.2.0.2 PSWindowsUpdate
Alias Hide-WindowsUpdate 2.2.0.2 PSWindowsUpdate
Alias Install-WindowsUpdate 2.2.0.2 PSWindowsUpdate
--snip--
> Install-WindowsUpdate
>
我通过“Install-Module -Name PSWindowsUpdate -Force”安装了该模块,并在 $HOME\Documents\PowerShell\Modules\PSWindowsUpdate 中创建了文件夹/文件。
作为测试,我:
- 将“PSWindowsUpdate”文件夹从 $HOME\Documents\PowerShell\Modules 移动到 C:\Program Files\PowerShell\7\Modules
- 重启电脑
- 重新运行命令“Install-WindowsUpdate”(与上述问题相同)
- 重新运行命令“Get-Command -module PSWindowsUpdate”
- 重新运行命令“Install-WindowsUpdate”,现在就可以使用了
作为另一项测试,我:
- 打开 Powershell 5.x 会话/窗口
- 通过“Install-Module -Name PSWindowsUpdate -Force”安装 PSWindowsUpdate 模块
- 关闭 Powershell 5.x 会话/窗口
- 打开另一个 Powershell 5.x 会话/窗口
- 重新运行命令“Install-WindowsUpdate”,没有任何问题
- 重启电脑
- 重新运行命令“Install-WindowsUpdate”,仍然没有问题
答案1
仅在系统上安装模块是不够的,您必须使用 将该模块加载到您的会话中Import-Module PSWindowsUpdate
。这里一个令人困惑的功能是,-Module
在命令中指定Get-Command -Module PSWindowsUpdate
实际上会Import-Module
在后台运行以检查该模块中的命令。例如,您可以复制此内容:
Get-Module AWSPowershell
# no output - module is not loaded
Get-Command -Module AWSPowershell
# CommandType Name Version
# ----------- ---- -------
# Alias Add-ALXBContactWithAddressBook 3.3.590.0
# Alias Add-ASInstances 3.3.590.0
# [etc]
Get-Module AWSPowershell
# ModuleType Version Name
# ---------- ------- ----
# Binary 3.3.590.0 awspowershell
根据文档,仅安装模块是不够的install-module
:“为了防止运行包含恶意代码的模块,安装后不会自动导入已安装的模块。”
Powershell 有一个环境变量可以设置你的偏好$PSModuleAutoLoadingPreference
::
- 全部:模块在首次使用时会自动导入。要导入模块,请获取或使用模块中的任何命令。例如,使用 Get-Command。
- 模块资格:仅当用户使用模块中命令的模块限定名称时,才会自动导入模块。例如,如果用户键入 MyModule\MyCommand,PowerShell 会导入 MyModule 模块。
- 没有任何:会话中已禁用模块的自动导入。要导入模块,请使用 Import-Module cmdlet。
有关自动导入模块的更多信息,请参阅关于模块。