PowerShell是一种强大而健壮的脚本语言。但要发挥其潜力,您必须知道如何导入正确的模块。
在本教程中,您将学到如何像专业人士一样导入PowerShell模块的一切知识。通过深入理解cmdlet、参数和模块,您可以创建比以往更快、更高效、更有效的脚本。
继续阅读,提升您的PowerShell技能,将脚本编写推向新的高度!
先决条件
本教程将进行实际演示。要跟随操作,请确保您的系统已安装PowerShell。本教程以Windows 10和PowerShell 5.1为例,但相同的命令应适用于大多数Windows版本和PowerShell。
导入单个模块
PowerShell模块包含您可以在脚本中使用的预构建代码,节省您的时间和精力。当您导入PowerShell模块时,您利用了预构建的代码,而不是从头开始。
但是如何导入PowerShell模块?Import-Module
cmdlet是在PowerShell中导入模块的主要方法。导入单个模块是Import-Module
cmdlet的最基本用法之一,这是您在本教程中将要学习的第一件事情。
以管理员身份打开PowerShell,并运行下面的Import-Module
命令来搜索PSDiagnostics
模块并将其加载到内存中。如果成功,模块将被导入,但该命令不会产生输出。
尽可能通过Install-Module cmdlet从在线存储库导入模块是非常推荐的。这个cmdlet会为您处理依赖关系和版本管理。
一旦导入了模块,您就可以使用该模块的任何 cmdlet 或函数来帮助诊断和解决问题。 Enable-PSTrace
cmdlet 是 PSDiagnostics 模块提供的 cmdlet 示例之一,它在 PowerShell 中启用诊断跟踪。
现在,运行以下 Enable-PSTrace
命令来执行诊断跟踪,并将结果保存到指定的 -TraceFilePath
(C:\\MyTrace.log
)。由于结果提交到文件中,此命令不会向控制台提供输出。
某些模块可能需要额外的配置或设置才能使用。务必阅读模块提供的文档,以了解任何先决条件或要求。
一次导入多个模块
导入单个模块可以正常工作。但是当您经常需要一次导入多个模块时,也可以使用 Import-Module
cmdlet 执行此任务。
一次导入多个模块是在 PowerShell 中节省时间和精力的好方法。但是究竟如何?您将通过逗号分隔指定模块名称。
运行以下命令以搜索多个模块(Dism, PowerShellGet, PSReadline
),并将它们加载到内存中。与导入单个模块类似,此命令不会提供输出。
显示模块导入详细信息
如前所述,成功导入模块不会提供输出。但是承认吧。你可能会怀疑模块是否确实已导入。
参数-Verbose
是一个有用的选项,你可以在许多 PowerShell 命令和函数中使用,包括Import-Module
命令。此参数告诉 PowerShell 在执行命令时显示详细信息。因此,你可以得到有价值的反馈,用于故障排除和调试。
运行以下命令导入 SmbShare
模块,并附加 -Verbose
参数以打印模块导入的详细信息。
如下所示,-Verbose
参数提供了关于加载的模块文件以及从模块导入的各种函数的详细信息。这些信息有助于理解模块的内部工作原理。
在这种情况下,SmbShare
模块提供了用于管理 Windows 机器上的 SMB 共享的 cmdlet。这些 cmdlet 包括但不限于 New-SmbShare
(创建新共享)和 Remove-SmbShare
(删除现有共享)。

在同一会话中重新导入模块
无论您的模块出了问题还是您只是想确保您正在使用最新版本的模块,重新导入 PowerShell 都是有益的。如何做?通过在 Import-Module
命令后附加 -Force
参数。
这个-Force
参数允许您在不必关闭和重新打开 PowerShell 会话的情况下继续使用模块提供的 cmdlet 和函数。
重新导入模块的一个常见用例是在开发并对模块进行更改时。您可以将模块重新导入到当前会话中,以在最终确定更改之前测试它们。
运行以下命令,-Force
PowerShell 以从其原始位置删除并重新导入SmbShare
模块。
-Prefix
参数允许您为从模块导入的 cmdlet 和函数指定前缀。在这种情况下,所有导入的 cmdlet 和函数都将以New
为前缀。该参数对于避免与会话中现有的 cmdlet 或函数发生冲突很有用。
例如,原始模块中的Get-SmbShare
cmdlet 将在重新导入的模块中变为Get-NewSmbShare
。
现在,运行下面的Get-Command命令,检索由选择的 SmbShare 模块提供的所有 cmdlet 和函数的列表(Select-Object)按名称。
下面,您可以看到SmbShare模块的cmdlet现在在它们的名称前面添加了前缀New。此输出确认模块已成功重新导入。

使用NuGet Packages手动导入PowerShell模块
到目前为止,您已成功从PowerShell Gallery导入模块。但如果您要查找的模块不在那里怎么办呢?
您可以从NuGet包手动安装和导入PowerShell模块。在PowerShell环境中,NuGet包是包含PowerShell模块及其工作所需的任何依赖模块或库的文件集合。
要从NuGet包导入模块,您需要按照以下步骤手动下载、提取和安装NuGet包:
1. 转到Azure PowerShell Gallery Az.Automation模块页面。
2. 接下来,单击手动下载选项卡 → 下载原始nupkg文件以下载该包。本教程以Azure PowerShell Gallery的Az.Automation 1.9.1模块为例。但相同步骤适用于其他NuGet包。

3. 下载后,运行以下Unblock-File
命令,该命令不提供输出,但会解锁下载的.nupkg文件。确保将文件路径更改为您下载包的路径。
解锁包是必要的。为什么?PowerShell可能不允许执行从互联网下载的文件,以防止执行潜在有害脚本的安全措施
4。现在,解压已下载的.nupkg文件到本地机器上的一个文件夹。您可能需要一个压缩/解压工具,如7-zip或WinRAR来解压包。NuGet包是一个ZIP存档,其中包含组成模块的文件集。
5. 从提取的文件夹中删除以下内容。
NuGet包的提取内容包括一些元数据和文件,这些对于手动模块安装是不需要的。
Name | Type |
---|---|
_rels | Folder |
Package | Folder |
[Content_Types].xml | XML File |
Az.Automation.nuspec | XML Manifest File |

6. 使用更具描述性的名称(例如az.automation)重命名提取的文件夹,以避免可能出现的任何错误。记住保持所有字母小写,并避免在名称中使用特殊字符。
7. 接下来,运行下面的$env:PSModulePath
命令,查找当前 shell 模块的路径。该命令返回系统上所有默认模块路径的列表。当在脚本或命令中指定模块名称时,PowerShell会搜索这些路径以自动加载模块。
注意这些路径,因为您将在以下步骤中需要它们。

8. 复制新命名的文件夹(az.automation)到步骤七中记录的目录之一。这样做可以定义模块的范围(特定用户或所有用户)。
Path | Function |
---|---|
C:\Users\admin\Documents\WindowsPowerShell\Modules | Makes the module available for the specific user account (admin). This tutorial uses this location as an example. |
C:\Program Files\WindowsPowerShell\Modules | Makes the module available for all user accounts on your local machine. |
9. 现在,运行以下命令来安装并导入模块(az.automation)到您的PowerShell会话中。确保用实际模块名称替换az.automation。

10. 最后,运行以下Get-Module命令来验证模块(az.automation)是否已成功导入。

也许您不想依赖自动发现。如果是这样,请在导入模块时指定确切的文件位置(C:\az.automation)。

结论
通过合并功能或分组代码,PowerShell模块改变了游戏规则。在本教程中,您已经学到了多种将PowerShell模块导入会话的方法,包括从NuGet包手动导入模块。您还涉及了控制导入过程的不同参数。
通过掌握这些技巧,您可以轻松地导入和使用模块来增强您的自动化脚本。但学习不必止步于此。为什么不通过学习导出模块成员,将您的PowerShell模块管理技能提升到下一个水平呢?
Source:
https://adamtheautomator.com/import-powershell-modules/