PowerShell 笔记 - 管道与模块

管道

PowerShell通过管道把命令连接起来, 管道通过传输一个命令, 把其输出作为另一个cmdlet的输入, 使得第二个命令可以通过第一个命令的结果作为输入并联合起来运行.

输出结果到文件

利用管道把进程信息导出到CSV/XML文件

Get-Process | Export-CSV process.csv
Get-Process | Export-CliXML process.xml

默认情况下可以用>符号把命令的结果输出到命令行, >是powershell中兼容cmd.exe的一个快捷方式, 实际上在powershell中的实现等同于| Out-File xxx.txt, 例如

Dir > dir.txt
Get-ChildItem | Out-File dir.txt # Dir 是Get-ChildItem 的别名

Out-File 创建的文件默认由80列宽, 可以用-Width 参数覆盖这个限制.

Powershell 中由很多Out-Cmdlets, 指定了默认的输出位置. 当执行Dir的时候, 实际运行的是Dir | Out-Default, 而Out-Default实际指向的是Out-Host, 所以命令的结果会输出到控制台. Windows下可用的Out-Cmdlets还有Out-Printer, Out-GridView等等

输出结果转化

powershell有类似Export-cmdlets的命令, 叫Convert-cmdlets, 可以把源输出的对象转化为html等指定类型, 也可以从源对象转化为其他类型. 不过Convert不会把转化后的对象直接保存到文件, 而是需要叠加管道符, 使用Out-Cmdlets 保件.

Get-Command *convert*

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Convert-Path                                       7.0.0.0    Microsoft.PowerShell.Manage…
Cmdlet          ConvertFrom-Csv                                    7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          ConvertFrom-Json                                   7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          ConvertFrom-Markdown                               7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          ConvertFrom-SecureString                           7.0.0.0    Microsoft.PowerShell.Securi…
Cmdlet          ConvertFrom-StringData                             7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          ConvertTo-Csv                                      7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          ConvertTo-Html                                     7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          ConvertTo-Json                                     7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          ConvertTo-SecureString                             7.0.0.0    Microsoft.PowerShell.Securi…
Cmdlet          ConvertTo-Xml                                      7.0.0.0    Microsoft.PowerShell.Utility
Application     afconvert                                          0.0.0.0    /usr/bin/afconvert
Application     apfs_hfs_convert                                   0.0.0.0    /sbin/apfs_hfs_convert
Application     avconvert                                          0.0.0.0    /usr/bin/avconvert
Application     convert-caffe2-to-onnx                             0.0.0.0    /usr/local/bin/convert-caff…
Application     convert-onnx-to-caffe2                             0.0.0.0    /usr/local/bin/convert-onnx…
Application     jupyter-nbconvert                                  0.0.0.0    /usr/local/bin/jupyter-nbco

Cmdlets 管理进程

带有相同名词的Cmdlets之间可以通过管道互传信息
例如使用powershell关闭记事本

Get-Process -Name notepad | Stop-Process

cmdlets修改系统时, 有一个内部定义的影响级别(impact level), 并且不允许修改, Shell 有一个响应的$ConfirmPreference设置, 默认为High, 如果cmdlets的内部影响级别大于Shell的$ConfirmPreference时,shell都会询问是否确定. 例如Stop-Process的时候对于每个进程都会询问.如果cmdlets的内部影响级别小于Shell的$ConfirmPreference, 就不会弹出提示. 如果需要每次都弹出, 可以加上-Confirm参数.

PowerShell扩展

PowerShell存在两种类型的扩展, 模块和管理单元.

管理单元

管理单元也叫PSSnapin, 通常包含一个或者多个DLL文件, 同时包含配置XML文件和帮助文档. PSSnapin必须先安装注册, powershell才能识别他们的存在.

PSSnapin的概念被逐步被微软移除了, 将来可以能越来越少出现, 在内部, 微软的重点是提供扩展模块.

Windows可以在Powershell中运行Get-PSSnapin -registered获取到可用的管理单元列表
运行Add-PSSnapin ${管理单元名称} 加载某个管理单元
运行Get-Command -pssnapin ${管理单元名称} 找出已增加的cmdlets命令
运行Get-PSProvider 可以查看管理单元是否成功加载到PSDrive

模块

PowerShell提供的第二种扩展方式称为模块, 模块被设计的更加独立, 因此更加容易分发, 工作原理类似于PSSnaoins.
模块不需要复杂的注册, PowerShell会自动在一个特定的目录下面查找模块, PSModule这个环境变量定义了PowerShell期望存放模块的路径

Get-Content Env:PSModulePath

PSModulePath 变量不能在PowerShell中修改, 可以在系统控制面板中修改. 或者通过组策略修改, 一些微软或者第三方的产品会修改改变量

Get-Module, Import-Moudle可以检索/导入远程/本地服务器的模块
如果一个模块不在PSModulePath变量下面,可以用Import-Module 并指定模块的完整路径.

命名冲突

如果两个模块中由相同的cmdlets命令, 比如A和B模块都有Get-User的cmdlets,B比A晚加载到powershell中 powershell会执行B的Get-User. A中的Get-User只能通过A\Get-User调用.

PowerShell配置文件

powershell手动导入模块后, 如果下次重新打开powershell窗口, 就需要把原来的模块重新导入. 可以用Export-Console C:\powershell.psc导出当前配置. 下次可以新建快捷方式在打开powershell窗口是自动载入配置powershell.exe -noexit -psconsolefile C:\powershell.psc

PowerShellGet 模块可以在线下载/升级模块, 在powershell v5以上版本可用.
https://www.powershellgallery.com 是微软官方的源, 可以使用Register-PSRepository 添加新的源, Get-PSRepository 查看已配置的源
使用FInd-Module查找模块, Install-Module下载安装模块

posted @ 2022-05-19 15:45  Chinor  阅读(143)  评论(0编辑  收藏  举报