本文最后更新于:8 个月前
PowerShell 是新式命令 shell,其中包括其他常用 shell 的最佳功能
PowerShell
官方文档
什么是 PowerShell? - PowerShell | Microsoft Learn
简介
PowerShell 是一种跨平台的任务自动化解决方案,由命令行 shell、脚本语言和配置管理框架组成。 PowerShell 在 Windows、Linux 和 macOS 上运行。
PowerShell 是新式命令 shell,其中包括其他常用 shell 的最佳功能。 与大多数仅接受并返回文本的 shell 不同,PowerShell 接受并返回 .NET 对象。包括以下功能:
PowerShell脚本
1、启动PowerShell
在Windows搜索栏中搜索“PowerShell”,即可打开PowerShell命令行。
笔者自己使用的是Windows terminal(终端应用程序),在MircoSoft Store即可下载
2、查看PowerShell命令
1 2 3 4 5 6 7 8 9
| Get-Command #获取所有powershell命令 Get-Command -Name '*Help' #根据名称筛选命令,执行完全匹配,可以使用通配符* Get-Command -Verb 'Get' #根据谓词筛选命令,谓词指Get-Command的左边部分 Get-Command -Noun U* #根据名词筛选,名词指Get-Command的右边部分 Get-Command -Verb 'Get' -Noun U* #组合筛选,进一步缩小范围
Set-Alias pwd Get-Location #给指定命令重命名
Get-Help #获取帮助
|
3、管理当前位置
1 2 3 4 5
| Get-Location #获取当前Path pwd #同上
Set-Location -Path D:\timegogo #设置当前Path cd D:\timegogo #效果同上,移动到指定目录
|
4、管理文件(夹)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #查看 Get-ChildItem -Path C:\Windows #列出指定目录下所有文件,-Path缺省时代表当前路径 ls #同上 Get-ChildItem -Path C:\WINDOWS -Recurse #列出文件夹内的项和子文件夹内包含的任何项 Get-ChildItem -Path C:\Windows -Force #列出包括隐藏的项在内的所有项 Get-ChildItem -Path C:\WINDOWS -Name *.txt #按名称筛选列出项 Get-ChildItem -Path C:\Windows\*.dll -Recurse -Exclude [a-y]*.dll #可通过 Get-ChildItem 的 Exclude 参数来排除特定项
#创建 New-Item -Path 'D:\temp' -ItemType Directory #创建文件夹 mkdir D:\temp #同上 New-Item -Path 'FileName' -ItemTYpe File #新建文件,如果不指定路径,默认为当前路径下
#删除 rm [-Force] FileName #删除文件 Remove-Item -Path FileName #同上 rm -Recurse DirName #删除文件夹 Remove-Item -Path DirName -Recurse #同上
#复制 Copy-Item -Path D:\timegogo\test\1.txt -Destination D:\timegogo\test\2.ini [-Force] #拷贝文件 cp 1.txt 2.ini #同上,不加路径的情况下,使用当前所在路径 Copy-Item C:\temp -Recurse C:\DeleteMe #复制文件夹 Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text #复制指定的内容,将目录下所有.txt文件复制
#移动 Move-Item -Path C:\temp\New.Directory -Destination C:\ -PassThru #如果没有-PassThru,将不显示任何结果
#重命名,只能重命名,尝试移动文件将失败 Rename-Item -Path C:\temp\New.Directory\file1.txt fileOne.txt
#执行文件,等效于“双击”操作 Invoke-Item C:\WINDOWS #打开路径为“C:\WINDOWS”的资源管理器窗口 Invoke-Item C:\boot.ini #调用Boot.ini文件
|
通配符规则:
- 星号 (
*
) 匹配零个或多个出现的任何字符。
- 问号 (
?
) 完全匹配一个字符。
- 左括号 (
[
) 字符和右括号 (]
) 字符括起一组要匹配的字符。
1 2 3
| Get-ChildItem -Path C:\Windows\x* #目录中查找以字母 x 开头的所有文件 Get-ChildItem -Path C:\Windows\?????.log Get-ChildItem -Path C:\Windows\[xz]* #查找名称以“x”或“z”开头的所有文件
|
5、管理进程
1 2 3 4 5 6 7
| Get-Process #获取所有运行中的进程 Get-Process -id 0 #指定进程 ID 来获取特定进程 Get-Process -Name ex* #指定进程 名称 来获取特定进程 Get-Process -Name exp*,power* #接受 Name 参数的多个值
Stop-Process -Name Idle #停止指定Name的进程 Stop-Process -Name t*,e* -Confirm #使用通配符,停止多个进程,使用Confirm参数逐项确认是否停止
|
6、管理服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #获取本地服务 Get Service #获取所有服务 Get Service -Name M* #通过-Name缩小范围 Get-Service -DisplayName se*
#获取必需服务、从属服务 Get-Service -Name LanmanWorkstation -RequiredServices #获取 LanmanWorkstation 服务需要的服务 Get-Service -Name LanmanWorkstation -DependentServices #获取需要 LanmanWorkstation 服务的服务
#启动服务 Start-Service -Name spooler
#停止服务 Stop-Service -Name spooler
#暂停服务 Suspend-Service -Name spooler
#重启服务 Restart-Service -Name spooler
|
PowerShell输入输出
1、读取输入
1 2 3
| #读取文本文件 #Get-Content 将从文件读取的数据视为数组,其中每行文件内容为一个元素 Get-Content -Path D:\readme.txt
|
2、管道
管道,与shell一样,|
为管道符号,把前一项的输出作为下一项的输入
Out-File 保存数据
1 2 3 4 5 6 7 8
| Get-Process | Out-File -FilePath D:\timegogo\temp\processlist.txt #将原本输出到终端的内容保存为指定文件,注意指定的目录必须已经存在,否则会报错。
Get-Process | Format-List | Out-File -FilePath D:\timegogo\temp\processlist2.txt #使用列表格式的进程信息页
Get-Process | Out-File -FilePath C:\temp\processlist.txt -Encoding ASCII #保存时指定编码格式
|
Out-Null 放弃输出
1
| Get-Command | Out-Null #不会输出任何内容,但不会放弃错误输出
|
Out-Host 控制台输出(默认)
Out-Host
cmdlet 的主要用途是分页。 例如,下面的命令使用 Out-Host
对 Get-Command
cmdlet 的输出进行分页:
1 2
| Get-Command | Out-Host -Paging #将输出进行分页 Get-Process | Format-List | Out-Host -Paging #显示列表格式的进程信息页,同时使用分页
|
1 2 3 4 5 6 7 8 9 10
| Get-Command -Verb Format | Format-Wide #只显示对象的默认属性(简化显示) Get-Command -Verb Format | Format-Wide -Property Noun #指定非默认属性(更简洁) Get-Command -Verb Format | Format-Wide -Column 3 #控制显示的列数
Get-Process -Name ex* | Format-List #以列表的形式显示对象 Get-Process -Name ex* | Format-List -Property Id,Name #指定需要显示的属性
Get-Service -Name win* | Format-Table #表格形式输出(默认) Get-Service -Name win* | Format-Table -AutoSize #自动调整列宽,防止内容被截断无法显示完整 Get-Service -Name win* | Format-Table -Wrap #自动换行
|
5、筛选输出数据
1 2 3 4 5
| #方式一:使用-Name参数 Get-Service -Name w32time
#方式二:通过管道传递到Where-Object执行筛选 Get-Service | Where-Object Name -eq w32time
|
PowerShell对象
与大多数仅接受并返回文本的 shell 不同,PowerShell 接受并返回 .NET 对象
1、Get-Member 查看对象属性
Get-Member
cmdlet 向你显示对象类型的正式名称及其成员的完整列表
1
| Get-Service -Name w32time | Get-Member
|
2、Select-Object 选择对象属性
可以使用 Select-Object
选择对象的部分属性,组成一个新的 PowerShell 对象
1
| Get-Service -Name w32time | Select-Object -Property Name,Status,ToString
|
3、Where-Object 筛选对象
借助 PowerShell 中的 Where-Object
cmdlet,可以测试管道中的每个对象,并沿管道仅传递满足特定测试条件的对象。
语法:输入 | Where-Object { FilterScript }
示例:
1
| 1,2,3,4 | Where-Object {$_ -lt 3}
|
1 2
| # 基于对象属性进行筛选 Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq 'Running'}
|
4、Sort-Object 对象排序
1 2 3 4 5 6 7 8
| Get-ChildItem | Sort-Object -Property LastWriteTime, Name #依次根据 LastWriteTime、Name 进行升序排序 Get-ChildItem | Sort-Object -Property LastWriteTime, Name -Descending #-Descending参数表示降序排序
#按 LastWriteTime 降序和 Name 升序对对象进行排序 Get-ChildItem | Sort-Object -Property @{ Expression = 'LastWriteTime'; Descending = $true }, @{ Expression = 'Name'; Ascending = $true } | Format-Table -Property LastWriteTime, Name
|
- 可以使用内置别名
sort
代替Sort-Object
e
可以代替Expression
d
可以代替Descending
,降序
a
可以代替Ascending
,升序