PowerShell 3.0 教程笔记
PowerShell 3.0 教程笔记
Module_0_视频链接
Module_1_克服对Shell的恐惧
-
开始使用
PowerShell
前应该先配置好PowerShell
(但是当前已经可以直接使用Windows Terminal
了,不配置了) -
cmdlet
的格式:动词-名词 -
set-location
:切换当前工作路径 -
get-childitem
:获取当前工作路径下的文件/目录列表 -
clear-host
:清空显示区 -
alias
即cmdlet
的别名 -
get-alias
:列出所有的别名和对应的cmdlet
列表-
get-alias
可以使用*
通配符来搜索别名列表,例如get-alias g*
搜索g
开头的别名列表,get-alias *sv
搜索sv
结尾的别名列表 -
Get-Alias -Definition cmdlet
通过cmdlet
查找别名
-
-
help
:获取帮助信息 -
PowerShell
支持Windows
原生命令-
notepad
:打开文本编辑器 -
calc
:打开计算器 -
mspaint
:打开画图 -
ping
:测试网络连通性 -
ipconfig /all
:获取网卡信息
-
Module_2_帮助系统
-
update-help
:更新帮助系统 -
get-help
:获取cmdlet
的帮助信息help
man
-
*
代表通配符,匹配0个到多个字符
-
get-verb
:获取动词信息 -
get-help cmdlet -Detailed
:获取详细的帮助信息 -
get-help cmdlet -Examples
:获取帮助信息中的例子列表 -
get-help cmdlet -Full
:获取全部的帮助信息 -
get-help cmdlet -Online
:使用默认浏览器获取在线帮助信息 -
get-help cmdlet -ShowWindow
:使用新窗口获取全部的帮助信息 -
get-service
:获取服务信息 -
get-process
:获取进程信息 - 技巧:通过
get-help
加*
(通配符)加关键字(例如:get-processs
可以用*pro*
)来查找命令列表,然后通过get-help cmdlet -ShowWindow
获取感兴趣的命令的全部的帮助信息,从帮助信息中获取例子并尝试使用
Module_3_使用管道建立连接和扩展Shell
-
管道即
|
,用于连接命令,将命令的结果传递到下一个命令中,再传递到下一个命令中,产生更好的结果- 例如:
get-process | export-csv -Path "C:\processInfo.csv"
就是获取所有进程信息对象并导出到C:\processInfo.csv
文件中
- 例如:
-
export-csv
:将cmdlet
执行结果导出到csV
中 -
import-csv
:将csv
文件中的数据导入PowerShell
-
export-clixml
:将cmdlet
执行结果导出到xml
中 -
import-clixml
:将xml
文件中的数据导入PowerShell
-
compare-object
:对比两个PowerShell
对象并打印出其中不相同的部分-
Get-Process | Export-Clixml -Path D:\process.xml notepad notepad2 calc Compare-Object -ReferenceObject (Import-Clixml -Path D:\process.xml) -DifferenceObject (Get-Process) -Property name
-
上述命令列表对比了两个不同的时刻,计算机里运行的进程列表的名字,并打印出不同的部分
-
-
out-file
:将cmdllet
执行结果输出到指定的文件中 -
get-content
:将文件中的数据读取到PowerShell
-
在
cmdlet
后面加上-whatif
,PowerShell
会把cmdlet
执行后的结果打印出来,但是并不会执行该cmdlet
,即模拟执行 -
在
cmdlet
后面加上-confirm
,PowerShell
会在cmdlet
执行前将执行后的结果打印出来,并询问是否确认执行
Module_4_用于管理的对象
-
cmdlet
返回的是对象,而不是文本 - 对象由属性和方法组成
-
Get-Process | Where-Object -Property id -gt 10000 | Sort-Object -Property id
:获取进程信息对象->只保留id
大于10000的->以id
属性正序排序 -
get-member
:获取对象的类型、属性列表、方法列表- 例如
get-process | get-member
为获取进程信息对象的类型、属性列表、方法列表
- 例如
-
select-object
:选择对象的属性- 例如:
Get-Process | Select-Object -Property HandleCount,Name,CPU
为获取进程信息对象->只获取进程信息对象中的句柄、名字、CPU
占比属性 - 例如:
Get-ChildItem | Select-Object -Property Name,Length | Sort-Object -Property Length
为获取当前目录下的文件\文件夹对象->只获取名字和长度属性->以长度属性正序排序 - 例如:
Get-ChildItem | Select-Object -Property Name,Length | Sort-Object -Property Length -Descending
为获取当前目录下的文件\文件夹对象->只获取名字和长度属性->以长度属性倒序排序
- 例如:
-
get-history
:获取输入过的命令历史信息 -
Get-Process | Group-Object -Property Name | Sort-Object -Property Count
:获取进程信息列表->合并相同Name
属性的对象->以数量正序排序 -
Get-Service | Where-Object -FilterScript { $PSItem.Status -eq "Running" -and $PSItem.Name -like "s*" }
:获取服务信息对象->只获取Status
为"Running"
的,且Name
以s
开头-
$PSItem
代表当前通过|
传递的对象 - 即
Get-Service
每获取到一个服务信息对象都会传递到|
后面的cmdlet
进行处理
-
- 技巧:先筛选结果再进行其它处理
- 例如:
Get-Process | Select-Object -Property Handle,CPU | Where-Object -Property Handle -gt 1000 | Sort-Object -Property Handle
这里就把筛选延后了,这不是最好的写法,应该先筛选再处理,即Get-Process | Where-Object -Property Handle -gt 1000 | Select-Object -Property Handle,CPU | S ort-Object -Property Handle
,越早筛选越好,这样后续管道需要处理的对象数越少
- 例如:
Module_5_深入探讨管道
-
管道传输的对象,必需与下一个
cmdlet
执行的对象相对应 -
可以通过
get-help
来获取cmdlet
所支持的可以通过管道传递的参数 -
管道传输的几种方式
-
ByValue
:前一个cmdlet
执行的对象传递到后一个cmdlet
执行的对象,如果对象一样的话,管道会执行成功 -
ByPropertyName
:前一个cmdlet
执行的对象的某个属性传递到后一个cmdlet
执行的属性参数中,如果属性名一致的话,管道会执行成功 - 如果属性名不一致时,可以通过
Select-Object
来进行属性名重命名来处理,如Get-Process -Name q* | Select-Object -Property Name, @{name='ProcessName'; expression={$PSItem.Name}}
,为获取所有程中以q
开头的进程,然后打印Name
属性,且打印一列名为ProcessName
的属性,值为$PSItem.Name
-
-
管道优先通过
ByValue
传递对象,如果对象类型与下一个要执行的cmdlet
所需的对象类型不匹配,管道会转而尝试通过ByProperty
来传递属性到下一个要执行的cmdlet
执行所需的参数中,如果属性名还是不匹配,就需要使用者自行将前一个cmdlet
中获取到的对象的感兴趣的属性通过Seclect-Object
重命名属性名后再传递到下一个cmdlet
中- 如何知道下一个
cmdlet
所需的对象类型或参数属性名是怎样的?通过Get-Help cmdlet -ShowWindow
,查看帮助文档可以找到
- 如何知道下一个
-
如果下一个命令没有能接受管道传输的对象或参数,即不支持直接的系统默认的管道传输时,可以通过将前一个
cmdlet
执行的结果经处理后直接放置到下一个cmdlet
的参数中直接使用,方法如下-
Get-ChildItem -Path (Get-Process -Name q* | Select-Object -ExpandProperty Path)
即通过q
开头的进程的路径来执行Get-ChildItem
-
Get-ChildItem -Path (Get-Process -Name q*).Path
即通过q
开头的进程的路径来执行Get-ChildItem
,通过获取对象的属性值 -
Get-Process -Name q* | Get-ChildItem -Path {$PSItem.Path}
即通过q
开头的进程的路径来执行Get-ChildItem
,通过获取$PSItem
对象的属性值
-
-
Get-CimInstance -ClassName Win32_BIOS
:获取本机的BIOS
信息
Module_6_在Shell中使用PowerShell远程管理
-
PowerShell
远程管理的安全性- 使用安全的端口
- 在域网络中,使用
HTTP
通信,且使用Kerberos
加密 - 在互联网或通过防火墙,使用
HTTP
通信加SSL
加密,且二次加密
-
Enable-PSRemoting
:启用远程管理- 需要使用管理员模式启动
PowerShell
- 需要使用管理员模式启动
-
Enter-PSSession -ComputerName 电脑名
:连接远程电脑的PowerShell
-
Invoke-Command
:远程执行命令 -
Get-Volume
:获取磁盘剩余空间 -
fomat-table
:生成表格- 例如
Get-Volume | Format-Table -Property DriveLetter,SizeRemaining,size -AutoSize
,即只使用DriveLetter,SizeRemaining,size
显示,比Select-Object
好的地方是可以使用-AutoSize
调整显示
- 例如
-
Get-Volume | Sort-Object -Property SizeRemaining | Select-Object -Last 3
,只显示剩余容量最大的三个磁盘 - PoweShell如何使用账号密码远程连接到远程
win7
- 本机上
- 使用管理员权限启动
PowerShell
- 执行
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "远程主机的IP或者电脑名" -Force
- 使用管理员权限启动
- 远程
Win7
上- 使用管理员权限启动
PowerShell
- 执行
Enable-PSRemoting -Force
- 使用管理员权限启动
- 然后在本机上输入
Enter-PSSession -ComputerName "远程主机名" -Credential $credential
,按照提示输入账号密码,即可进入远程管理主机模式 - 退出远程管理主机模式,执行
Exit-PSSession
- 本机上
Module_7_为自动化做好准备
-
Get-ExecutionPolicy
:获取当前PowerShell
脚本运行策略 -
Set-ExecutionPolicy
:设置当前PowerShell
脚本运行策略- 默认为
RemoteSign
,最好设置为AllSign
- 默认为
-
New-SelfSignedCertificate
:创建PowerShell
脚本自签名证书 -
Set-AuthenticodeSignature
:使用证书对PowerShell
脚本进行签名 -
Get-ChildItem Cert:\CurrentUser -Recurse -CodeSigningCert
:获取本机上本用户的签名证书 -
$
开头代表后续为变量名,即PowerShell
使用$
来区分变量和cmdlet
- 如果执行对象方法后,对象的的属性存在问题,则执行一下
refresh
函数(如果有),再获取对象的属性 -
read-host
:读取命令行输入信息,类比pyhton
的input
-
write-host
:输出信息到命令行,类别pyhton
的print
- 该
cmdlet
不支持管道
- 该
-
write-object
:将对象输出到命令行,支持管道 -
writ-warning
:使用PowerShell
的警告配色输出信息到命令行 -
writ-error
:使用PowerShell
的错误配色输出信息到命令行
Module_8_大规模自动化:远程操作
-
invoke-command
只使用电脑名执行命令时,命令执行完毕会自动关闭远程PowerShell
-
New-PSSession
:创建远程PowerShell
会话- 使用创建出来的会话来连续执行命令
- 操作会话速度会更快
-
Get-PSSession
:获取当前PowerShell
会话列表 -
Measure-Command {命令}
:统计命令的执行时间 -
Copy-Item
:复制文件,支持复制本机文件到远程机器或者从远程机器复制文件到本机 -
Import-PSSession
:为会话安装远程主机上的模块,执行该命令并不会在本机上安装对应的模块,模块只对指定会话生效,且会话关闭后,模块文件清空,且模块执行的命令对象为远程主机- 隐式远程代理
- 如
Import-PSSession -Session $s -Module Get-Process -Prefix remote
,执行后,在当前PowerShell
执行的Get-remoteProcess
命令得到的结果,等同于Invoke-Command -Session $s {Get-Process}
命令得到的结果
-
Get-Command
:获取命令信息
Module_9_脚本和工具制作简介
-
PowerShell ISE
为编写PowerShell
脚本的IDE
-
Get-WmiObject win32_logicaldisk -Filter "DeviceId='C:'"
:获取C盘的信息 -
为脚本增加其它信息
-
使用
param
为脚本增加参数,如param( $ComputerName = "localhost", $bogus )
然后就可以
Get-WmiObject -ComputerName $ComputerName -class win32_logicaldisk -Filter "DeviceId='C:'"
这样在脚本文件中使用参数,且使用get-help 脚本文件
时可以看到对应的参数要求 -
为
param
脚本参数指定类型,默认为object
类型,如param( [string]$ComputerName = "localhost", $bogus )
使用
get-help 脚本文件
时可以看到对应的参数ComputerName
类型要求变为了string
-
为脚本增加默认参数
[CmdletBinding()] param( [string]$ComputerName = "localhost", $bogus )
使用
get-help 脚本文件
时可以看到除了$ComputerName
和$bogus
参数外,还有[<CommonParameters>]
的参数 -
改变
param
脚本参数为强制参数,默认为非强制参数,即不需要提供该参数也可运行,如[CmdletBinding()] param( [Parameter(Mandatory=$True)] [string]$ComputerName = "localhost", $bogus )
使用
get-help 脚本文件
时可以看到对应的参数ComputerName
变为了强制参数,且运行脚本时也会提示为对应的参数提供值 -
使用注释为脚本文件增加帮助信息
<# .Synopsis 短描述的关键字 This is short description .Description 长描述的关键字 This is long description .Parameter ComputerName 参数说明 This is for remote computer's name .Example 例子说明 diskinfo -ComputerName remote This is for a remote computer #>
使用
get-help 脚本文件
时就可以类似于PowerShell
默认的命令一样样式的注释了 -
在
ISE
中使用Ctrl+J
,选择Cmdlet(高级功能)
,就可以在脚本上看到跟4一样的预设好的模板注释了 -
函数关键字
Funciton
,注意函数命名最好跟PowerShell
对Cmdlet
的要求一样,即动词-名词形式,例如Function Get-DiskInfo { [CmdletBinding()] param( [Parameter(Mandatory=$True)] [string[]]$ComputerName = "localhost", $bogus ) Get-WmiObject -ComputerName $ComputerName -class win32_logicaldisk -Filter "DeviceId='C:'" }
-
-
在当前
PowerShell
窗口的堆栈上运行脚本,在脚本路径前加上.
即可,例如. D:\DiskInfo.ps1
- 默认情况下,运行脚本时,
PowerShell
会使用新的堆栈来运行脚本,脚本运行完毕后,该堆栈销毁,脚本中的变量和函数都会销毁 - 在脚本路径上增加
.
后,由于在当前PowerShell
窗口的堆栈上运行脚本,所以只有在当前当前PowerShell
窗口关闭后,脚本中的变量和函数才会销毁
- 默认情况下,运行脚本时,
-
生成脚本模块文件
- 简单方法:脚本后缀修改为
psm1
即可- 如果模块文件不在特殊路径下,则需要在当前
PowerShell
窗口中手动导入模块,例如执行Import-Module .\diskinfo.psm1
即将diskinfo
脚本模块导致当前PowerShell
窗口,之后即可使用模块中的元素(使用Import-Module .\diskinfo.psm1 -Verbose
可以看到导入模块时的 详细信息) - 在
PowerShell
窗口中执行$env:PSModulePath
,即可看到特殊路径列表,每次启动PowerShell
窗口时,PowerShell
均会自动加载特殊路径列表中的模块文件,即我们只需将模块文件放入特殊路径列表中任一路径,后续不用自行手动导入该模块文件就可以使用模块文件中的元素了- 在特殊路径下,创建跟自定义模块文件一样的文件夹后,将自定义模块文件放进该文件夹即可
- 使用
$env:PSModulePath -split ";"
可以更好地看到特殊路径列表 - 最好不要将自定义的模块文件放入
PowerShell
的安装目录下的特殊路径中
- 如果模块文件不在特殊路径下,则需要在当前
- 简单方法:脚本后缀修改为
推荐阅读
-
PowerShell 3.0 教程笔记
-
《Unix & Linux 大学教程》 - 第十三章 学习笔记
-
[ASP.NET Core 3.0学习笔记] - SignalR
-
PHP笔记之:日期函数的使用介绍_PHP教程
-
php入门教程xml学习笔记
-
vue3.0 CLI - 3.2 路由的初级使用教程
-
PHP读书笔记(4)-运算符,php读书笔记运算符_PHP教程
-
CI框架源码阅读笔记8 控制器Controller.php_PHP教程
-
RedhatAS3.0上安装Apache2+PHP5+MySQL+Resin+SSL+GD+weba_PHP教程
-
php基础入门篇学习笔记,php入门篇学习笔记_PHP教程