PowerShell

本文最后更新于: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一样,|为管道符号,把前一项的输出作为下一项的输入

3、重定向

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-HostGet-Command cmdlet 的输出进行分页:

1
2
Get-Command | Out-Host -Paging	#将输出进行分页
Get-Process | Format-List | Out-Host -Paging #显示列表格式的进程信息页,同时使用分页

4、格式化输出

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

image-20221127233909062

2、Select-Object 选择对象属性

可以使用 Select-Object 选择对象的部分属性,组成一个新的 PowerShell 对象

1
Get-Service -Name w32time | Select-Object -Property Name,Status,ToString
image-20221127234115855

3、Where-Object 筛选对象

借助 PowerShell 中的 Where-Object cmdlet,可以测试管道中的每个对象,并沿管道仅传递满足特定测试条件的对象。

语法:输入 | Where-Object { FilterScript }

示例:

1
1,2,3,4 | Where-Object {$_ -lt 3}
image-20221127234358481
1
2
# 基于对象属性进行筛选
Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq 'Running'}
  • FilterScript 值是计算结果为 True 或 False 的脚本块,即由大括号 ({}) 括起来的一个或多个 PowerShell 命令

  • $_符号表示管道中当前的对象

  • 比较运算符:

    比较运算符 含义 示例(返回 True)
    -eq 等于 1 -eq 1
    -ne 不等于 1 -ne 2
    -lt 小于 1 -lt 2
    -le 小于或等于 1 -le 2
    -gt 大于 2 -gt 1
    -ge 大于或等于 2 -ge 1
    -like 相似(文本的通配符比较) “file.doc” -like “f*.do?”
    -notlike 不相似(文本的通配符比较) “file.doc” -notlike “p*.doc”
    -contains 包含 1,2,3 -contains 1
    -notcontains 不包含 1,2,3 -notcontains 4
  • 逻辑运算符:

    逻辑运算符 含义 示例(返回 True)
    -and Logical and;如果两侧都为 True,则返回 True (1 -eq 1) -and (2 -eq 2)
    -or Logical or;如果某一侧为 True,则返回 True (1 -eq 1) -or (1 -eq 2)
    -not Logical not;反转 True 和 False -not (1 -eq 2)
    ! Logical not;反转 True 和 False !(1 -eq 2)

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,升序

PowerShell
http://timegogo.top/2022/06/21/Windows/PowerShell/
作者
丘智聪
发布于
2022年6月21日
更新于
2023年7月16日
许可协议