PowerShell 101:导入模块

你是否曾经运行过一个 PowerShell 命令,然后收到了可怕的“未将 ‘xxx’ 作为 cmdlet 的名称识别”错误消息?问题可能如此简单,只是一个缺失或未导入的模块。即使在现代 PowerShell 版本中,理解模块如何工作是诊断和解决这些问题的关键。

好消息是?本指南涵盖了从检查 PowerShell 当前导入的模块到掌握如何导入、移除和重新导入它们的所有内容。最终,您将熟练掌握无缝管理 PowerShell 模块的技巧,无论是排除意外错误还是处理自定义模块。

开始学习,让 PowerShell 模块帮助您自信地优化工作流程!

检查已导入的模块

当模块未正确加载时,PowerShell 命令可能会失败并显示晦涩的错误消息。例如,尝试在未首先导入 ActiveDirectory 模块的情况下运行 Get-ADUser 将导致“找不到命令”错误。同样,尝试使用 Azure 命令需要会话中存在 Az 模块。

PowerShell 必须导入相关模块以确保命令按预期工作并提供其命令。

要查看当前已导入的模块,请使用:

Get-Module

运行 Get-Module 时,您将看到类似以下输出:

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   7.0.0.0    Microsoft.PowerShell.Management    {Add-Computer, Add-Content, Checkpoint-Computer...}
Manifest   7.0.0.0    Microsoft.PowerShell.Utility       {Add-Member, Add-Type, Clear-Variable...}
Script     2.0.0      PSReadline                         {Get-PSReadLineKeyHandler, Get-PSReadLineOption...}
Binary     1.0.0.1    SmbShare                          {Get-SmbShare, Set-SmbShare, Remove-SmbShare...}

这显示了 PowerShell 会话中当前加载的所有模块的列表,显示它们的类型(Manifest、Script 或 Binary)、版本号、模块名称以及提供的命令摘要。ExportedCommands 列显示每个模块提供的哪些 cmdlet。

接下来,检查可以导入的模块中的命令:

Get-Module -Name SmbShare -ListAvailable | Select exportedcommands

运行此命令后,您将看到列出 SmbShare 模块中所有可用命令的输出。例如:

ExportedCommands
----------------
{Get-SmbShare, New-SmbShare, Remove-SmbShare, Set-SmbShare, Get-SmbShareAccess, 
Grant-SmbShareAccess, Block-SmbShareAccess, Revoke-SmbShareAccess, Get-SmbMapping}

此输出显示您可以从 SmbShare 模块中使用的所有 cmdlet。每个命令都有特定的目的,用于管理 SMB 共享:

  • Get-SmbShare:列出系统上的所有 SMB 共享
  • New-SmbShare:创建新的 SMB 共享
  • Remove-SmbShare:删除现有的 SMB 共享
  • Set-SmbShare:修改现有共享的属性

了解可用的命令有助于您选择适合任务的正确工具。您可以使用类似的命令来探索其他模块的功能。

自动导入模块

要了解 PowerShell 如何动态处理模块,请看下面的示例,显示了动态加载模块的情况:

PS> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   7.0.0.0    Microsoft.PowerShell.Management    {Add-Computer, Add-Content...}
Manifest   7.0.0.0    Microsoft.PowerShell.Utility       {Add-Member, Add-Type...}
Script     2.0.0      PSReadline                         {Get-PSReadLineKeyHandler...}

PS> Get-SmbShare

PS> Get-Module

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   7.0.0.0    Microsoft.PowerShell.Management    {Add-Computer, Add-Content...}
Manifest   7.0.0.0    Microsoft.PowerShell.Utility       {Add-Member, Add-Type...}
Script     2.0.0      PSReadline                         {Get-PSReadLineKeyHandler...}
Binary     1.0.0.1    SmbShare                          {Get-SmbShare, Set-SmbShare...}

如上所示,当您运行 Get-SmbShare 时,PowerShell 会自动导入 SmbShare 模块。您可以看到此模块在运行命令后出现在列表中。

移除和重新导入模块

您可能需要从内存中清除模块,比如在测试新配置或解决冲突时。如果是这样,不用担心;PowerShell 允许您移除模块而无需卸载它,使您可以根据需要重置或刷新会话。

要从内存中移除模块:

Remove-Module -Name SmbShare

Remove-Module cmdlet 从内存中清除模块,但不会从系统中卸载它。虽然在日常使用中很少移除模块,但在特定情况下是很有用的。

要手动重新导入模块:

Import-Module -Name SmbShare

手动导入在故障排除或在自定义环境中使用时很有帮助。

更改后重新导入模块

在开发中的模块上工作时,可能会遇到您所做的更改并没有立即生效的情况。旧数据或配置可能仍然加载在模块中,导致这种行为。

重新导入模块可以确保 PowerShell 使用最新版本。如果修改了正在开发的模块,则必须重新导入它。

您可以同时使用 Remove-ModuleImport-Module,或者使用 Force 参数简化流程:

Import-Module -Name SmbShare -Force

Force 参数一次性卸载并重新加载模块,非常适合开发和测试工作流程。

结论

在本指南中,您已经学会了如何管理 PowerShell 模块——检查导入、导入、移除和重新导入模块。您还探讨了 PowerShell 如何动态导入模块以及如何控制加载以手动进行故障排除或测试自定义配置。

现在,通过在脚本中尝试自定义模块来应用这些技能。探索模块开发,并使用 Force 参数确保更改生效。

提高您的故障排除、脚本开发和整体 PowerShell 工作流程,使用 PowerShell 模块!

Source:
https://adamtheautomator.com/powershell-modules-guide-2/