PowerShell 学习笔记 - 2 PS Module
PowerShell 学习笔记 - 2 PS Module
本章主要探讨 PowerShell 的模块化,由于 PowerShell Core 现版本下已经移植的模块较少以及存在大量强依赖于平台的功能(例如 Hyper-V 相应的管理模块),此处主要依照 Windows PowerShell 实现:
获取模块加载信息 Get-Module
启动一个 mcr.microsoft.com/powershell:centos-7
官方容器可以发现其默认的引入了三个模块,即:
Microsoft.PowerShell.Management
和Microsoft.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相关推荐
- PowerShell 学习笔记 - 1 PS Core 基础
PowerShell 学习笔记 - 1 PS Core 基础 本章主要探讨 PowerShell 核心,主要基于 Linux 平台上的 PowerShell Core 实现,实际上于 Windows ...
- PowerShell学习笔记(1)-基础
PowerShell学习笔记(1):基础 前段时间在知乎上得知Windows下的一款强大的命令行工具PowerShell(原谅我刚刚得知). 其强大的功能,令人惊叹,兴趣盎然,这么优秀的工具值得我 ...
- Powershell学习笔记——函数和函数库
前段时间公司封闭开发,就在封闭的前一天感冒发烧,为了封闭,一顿猛药下去,烧是退了,却在扁桃附近爆发出来--扁桃发炎加溃疡,搞了十多天才好啊,天天喝稀饭啊--所以请大家原谅这么久没有续上学习笔记.顺便: ...
- PowerShell学习笔记(三)
九.PowerShell学习建议和资源 学习建议: 1.先看PowerShell 入门书籍,学习基本用法: 2.多读现有脚本,体会语法和相关用法: 3.搭建环境尝试构建适用于自身的脚本并实 ...
- [Learn Notes] PowerShell学习笔记
这几天抽空学习了一下PowerShell,领略了其强大之处. 本想好好的写点笔记,到网上一翻,还真有现成的笔记(http://www.ansatt.hig.no/erikh/tutorial-powe ...
- powershell 学习笔记
命令模式 //字符串不需要加引号,除变量和圆括号中的内容外的所有内容均可看作字符串 copy users.txt accounts.txt copy $src ...
- PowerShell 学习笔记——运行命令
谈到"Shell",很容易与脚本.编程语言等联系起来,这也是很多ITPro不去钻研PowerShell的原因.很多ITPro们认为用好PowerShell就要涉及到复杂的函数.变量 ...
- PowerShell 学习笔记——文件系统
一个操作系统必须具备的元素就是:文件系统.在 Windows 中,使用资源管理器和 PowerShell 都可以管理文件系统,但它们是有区别的. 一.文件系统的结构 Windows中,文件系统由磁盘驱 ...
- PowerShell 学习笔记:压缩、解压缩文件
在自动构建的时候,最常用的就是压缩备份项目的源文件,PowerShell提供了相关命令. Compress-Archive(压缩文件) Compress-Archive[-Path] <Stri ...
最新文章
- FlushMode属性与transaction(spring注入的事务)
- Linux 虚拟化网络技术 — 虚拟网络协议栈
- 关于IB_DESIGNABLE / IBInspectable的那些事
- html中实现th标签添加分页,html – 如何在Angular 4中为表添加分页?
- 上海大学计算机工程与科学学院官网,上海大学计算机工程与科学学院.PDF
- python指数运算是不是有问题_为什么在Python 3中复指数运算如此之快?
- 直接获取Program Files目录的API
- 我的世界Java种子大全_种子(世界生成)
- 税盘怎么看服务器是否在维护,税盘服务器地址怎么查
- 如何激活Windows Server 2008 R2
- 弘辽科技:淘宝改SKU图片会影响权重吗?
- SSD固态硬盘重装win10系统 无法分区,gpt格式
- 设置计算机网络文件共享,局域网电脑文件共享怎么设置
- word/excel 通配符
- 自学Python编程的第\七天----------来自苦逼的转行人
- Hive学习(待续)
- 去除加粗的css,CSS去掉b加粗和strong加粗标签样式
- 第二证券|鲍威尔发声:释放重磅信号,美股大涨!中概股狂涨
- 《人,绩效和职业道德》及博客读后感
- [Unity3d]unity从入门到精通官方教程
热门文章
- CommonJS模块的循环加载
- 左列定宽,右列自适应
- 如何在Javascript中创建范围
- duri oracle 连接字符串_Oracle连接字符串大全
- 20190909:(leetcode习题)第一个错误的版本
- mysql cluster 数据文件_关于MYSQL CLUSTER数据文件存放节点错误问题 -问答-阿里云开发者社区-阿里云...
- python 朋友圈leetcode_利特代码0547。朋友圈[python],LeetCode0547FriendCircles,Python
- 怎看沃科斯扫地机器人型号_科沃斯型号区别是什么?
- idea中java文件红色处理
- [vb]FindWindow使用方法