PowerShell 学习笔记 - 2 PS Module

本章主要探讨 PowerShell 的模块化,由于 PowerShell Core 现版本下已经移植的模块较少以及存在大量强依赖于平台的功能(例如 Hyper-V 相应的管理模块),此处主要依照 Windows PowerShell 实现:

获取模块加载信息 Get-Module

启动一个 mcr.microsoft.com/powershell:centos-7 官方容器可以发现其默认的引入了三个模块,即:

  • Microsoft.PowerShell.ManagementMicrosoft.PowerShell.Utility,用于提供 PowerShell 基本语法实现
  • Script 模块用于提供 PowerShell 具体的运行环境
PS /> $PSVersionTable.OS
Linux 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:55:56 UTC 2018
PS /> Get-ModuleModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   6.1.0.0    Microsoft.PowerShell.Management     {Add-Content, Clear-Content, Clear-Item, Clear-ItemPropert...
Manifest   6.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Script     2.0.0      PSReadLine                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PS...

同时可以通过为 Get-Module 附加参数 -ListAvailable 以列出可用的 Module,从现版本看有 10 个:

PS /> (Get-Module -ListAvailable).Length
10

反观 Windows 10 Build 17134 上 PowerShell 所拥有的 Module,有 85 个之多:

PS C:\Users\chuny> $PSVersionTable.BuildVersion.Major
10PS C:\Users\chuny> (Get-Module -ListAvailable).Length
85

但这个问题可以辩证的看,虽然 macOS / Linux 平台上的 PowerShell Core 只拥有少的可怜的基本模块,但得益于 GNU 计划的原生 CLI 工具,实际上并不输 Windows,仍然拿 Hyper-V 模块举例,微软通过提供 PowerShell Hyper-V Module 使能其基于 CLI 的管理功能,开源世界的竞品 QEMU/KVM 等,均通过提供相应的二进制以进行管理,因此 PowerShell Core 在此时只是纯粹的“命令行胶水”,但这不影响其“与原生功能构成平台”的能力。

以基础模块 Microsoft.PowerShell.Utility 为例,所有模块均以 .psd1 的 PowerShell 字典格式存储于文件中,而运行时会根据平台连接到对应的 .Net 实例中:

# Windows
PS C:\Users\chuny> (Get-Module -Name Microsoft.PowerShell.Utility).Path
C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Utility\Microsoft.PowerShell.Utility.psd1# Linux
PS /> (Get-Module -Name Microsoft.PowerShell.Utility).Path
/opt/microsoft/powershell/6/Modules/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1# 该字典指向如下递归模块
PS /opt/microsoft/powershell/6> cat /opt/microsoft/powershell/6/Modules/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 | grep NestedModules
NestedModules="Microsoft.PowerShell.Commands.Utility.dll","Microsoft.PowerShell.Utility.psm1"# 庐山真面目,即是这个 DLL
PS /opt/microsoft/powershell/6> Get-Item ./Microsoft.PowerShell.Commands.Utility.dllDirectory: /opt/microsoft/powershell/6
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------          9/10/18   8:30 PM        1718784 Microsoft.PowerShell.Commands.Utility.dll

加载/卸载模块 Import/Remove-Module

通过 Get-Command 找到 Microsoft.PowerShell.Core 即 PowerShell Core 对于 Module 一共提供了 4 个 cmdlet,除去用于新建模块的 Add-Module 和上节中的 getter 方法,剩下两个便是加载与卸载:

PS C:\Users\chuny> Get-Command -Noun Module | Where-Object {$_.Source.ToString() -eq "Microsoft.PowerShell.Core"}CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-Module                                         3.0.0.0    Microsoft.PowerShell.Core
Cmdlet          Import-Module                                      3.0.0.0    Microsoft.PowerShell.Core
Cmdlet          New-Module                                         3.0.0.0    Microsoft.PowerShell.Core
Cmdlet          Remove-Module                                      3.0.0.0    Microsoft.PowerShell.Core       

以常见的 TroubleshootingPack 即错误调试工具包模块为例(很遗憾,截至当前 PowerShell Core 还未包含统一的跨平台,且由于 Linux 的崩溃没有一个统一且良好的收集体系,用户态崩溃信息分散且一般不会触发 coredump,因此也很难给出这样的统一排错工具包):

# Windows PowerShell
PS C:\Users\chuny> (Get-Module).Name.Contains("TroubleshootingPack")
False# 加载模块
PS C:\Users\chuny> Import-Module TroubleshootingPackPS C:\Users\chuny> (Get-Module).Name.Contains("TroubleshootingPack")
True# 该模块共提供了两个 cmdlet
PS C:\Users\chuny> (Get-Module -Name TroubleshootingPack).ExportedCmdletsKey                        Value
---                        -----
Get-TroubleshootingPack    Get-TroubleshootingPack
Invoke-TroubleshootingPack Invoke-TroubleshootingPackPS C:\Users\chuny> (Get-TroubleshootingPack -Path "C:\Windows\diagnostics\system\Apps").RootCausesName
----
你已使用临时配置文件登录
用户帐户控制已禁用
需要 Microsoft 帐户
临时 Internet 文件位置已更改
悬挂或崩溃的应用                    

卸载模块即为反操作:

PS C:\Users\chuny> Remove-Module -Name TroubleshootingPackPS C:\Users\chuny> (Get-Module).Name.Contains("TroubleshootingPack")
False

实际上,当一个模块还未被引入,直接调用其内部的 cmdlet 时,PowerShell 将完成自动引入的过程,但在脚本制作时应严格禁止这样的默认引入,以避免可能的命名冲突,并在引用前检查目标模块是否可以被引用成功。

PowerShell 学习笔记 - 2 PS Module相关推荐

  1. PowerShell 学习笔记 - 1 PS Core 基础

    PowerShell 学习笔记 - 1 PS Core 基础 本章主要探讨 PowerShell 核心,主要基于 Linux 平台上的 PowerShell Core 实现,实际上于 Windows ...

  2. PowerShell学习笔记(1)-基础

    PowerShell学习笔记(1):基础   前段时间在知乎上得知Windows下的一款强大的命令行工具PowerShell(原谅我刚刚得知). 其强大的功能,令人惊叹,兴趣盎然,这么优秀的工具值得我 ...

  3. Powershell学习笔记——函数和函数库

    前段时间公司封闭开发,就在封闭的前一天感冒发烧,为了封闭,一顿猛药下去,烧是退了,却在扁桃附近爆发出来--扁桃发炎加溃疡,搞了十多天才好啊,天天喝稀饭啊--所以请大家原谅这么久没有续上学习笔记.顺便: ...

  4. PowerShell学习笔记(三)

    九.PowerShell学习建议和资源 学习建议:    1.先看PowerShell 入门书籍,学习基本用法: 2.多读现有脚本,体会语法和相关用法:    3.搭建环境尝试构建适用于自身的脚本并实 ...

  5. [Learn Notes] PowerShell学习笔记

    这几天抽空学习了一下PowerShell,领略了其强大之处. 本想好好的写点笔记,到网上一翻,还真有现成的笔记(http://www.ansatt.hig.no/erikh/tutorial-powe ...

  6. powershell 学习笔记

    命令模式        //字符串不需要加引号,除变量和圆括号中的内容外的所有内容均可看作字符串        copy users.txt accounts.txt        copy $src ...

  7. PowerShell 学习笔记——运行命令

    谈到"Shell",很容易与脚本.编程语言等联系起来,这也是很多ITPro不去钻研PowerShell的原因.很多ITPro们认为用好PowerShell就要涉及到复杂的函数.变量 ...

  8. PowerShell 学习笔记——文件系统

    一个操作系统必须具备的元素就是:文件系统.在 Windows 中,使用资源管理器和 PowerShell 都可以管理文件系统,但它们是有区别的. 一.文件系统的结构 Windows中,文件系统由磁盘驱 ...

  9. PowerShell 学习笔记:压缩、解压缩文件

    在自动构建的时候,最常用的就是压缩备份项目的源文件,PowerShell提供了相关命令. Compress-Archive(压缩文件) Compress-Archive[-Path] <Stri ...

最新文章

  1. FlushMode属性与transaction(spring注入的事务)
  2. Linux 虚拟化网络技术 — 虚拟网络协议栈
  3. 关于IB_DESIGNABLE / IBInspectable的那些事
  4. html中实现th标签添加分页,html – 如何在Angular 4中为表添加分页?
  5. 上海大学计算机工程与科学学院官网,上海大学计算机工程与科学学院.PDF
  6. python指数运算是不是有问题_为什么在Python 3中复指数运算如此之快?
  7. 直接获取Program Files目录的API
  8. 我的世界Java种子大全_种子(世界生成)
  9. 税盘怎么看服务器是否在维护,税盘服务器地址怎么查
  10. 如何激活Windows Server 2008 R2
  11. 弘辽科技:淘宝改SKU图片会影响权重吗?
  12. SSD固态硬盘重装win10系统 无法分区,gpt格式
  13. 设置计算机网络文件共享,局域网电脑文件共享怎么设置
  14. word/excel 通配符
  15. 自学Python编程的第\七天----------来自苦逼的转行人
  16. Hive学习(待续)
  17. 去除加粗的css,CSS去掉b加粗和strong加粗标签样式
  18. 第二证券|鲍威尔发声:释放重磅信号,美股大涨!中概股狂涨
  19. 《人,绩效和职业道德》及博客读后感
  20. [Unity3d]unity从入门到精通官方教程

热门文章

  1. CommonJS模块的循环加载
  2. 左列定宽,右列自适应
  3. 如何在Javascript中创建范围
  4. duri oracle 连接字符串_Oracle连接字符串大全
  5. 20190909:(leetcode习题)第一个错误的版本
  6. mysql cluster 数据文件_关于MYSQL CLUSTER数据文件存放节点错误问题 -问答-阿里云开发者社区-阿里云...
  7. python 朋友圈leetcode_利特代码0547。朋友圈[python],LeetCode0547FriendCircles,Python
  8. 怎看沃科斯扫地机器人型号_科沃斯型号区别是什么?
  9. idea中java文件红色处理
  10. [vb]FindWindow使用方法