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
下载安装模块