PowerShell 基础入门
PowerShell 是微软推出的跨平台命令行外壳(Shell)和脚本语言,Windows 自带,也可安装在 Linux / macOS 上。 它的核心特点是:一切皆对象,命令之间通过管道传递对象,而不是纯文本。
1. 认识 PowerShell
1.1 与 CMD 的区别
| 对比项 | CMD(命令提示符) | PowerShell |
|---|---|---|
| 管道传递内容 | 纯文本 | 对象 |
| 命令风格 | 独立小工具 | 统一的「动词-名词」 |
| 脚本能力 | 弱(批处理) | 强(完整语言) |
| 跨平台 | 否 | 是(PowerShell 7+) |
| 别名兼容 | — | 支持 ls、cd、cat 等 |
1.2 版本
- Windows PowerShell 5.1:Windows 自带,仅 Windows。
- PowerShell 7.x(
pwsh):跨平台,推荐使用,命令为pwsh。
1.3 启动方式
- 开始菜单搜索
PowerShell或pwsh - Win + X → 「终端」/「Windows PowerShell」
- 在文件资源管理器地址栏输入
powershell回车 - VS Code 内置终端
1.4 命令结构:动词-名词
PowerShell 命令(cmdlet)统一为 动词-名词 格式:
Get-Process # 获取进程
Set-Location # 切换目录
Copy-Item # 复制项目
Remove-Item # 删除项目
常见动词:Get(获取)、Set(设置)、New(新建)、Remove(删除)、Start(启动)、Stop(停止)。
1.5 学会自己查帮助
Get-Help Get-Process # 查看帮助
Get-Help Get-Process -Examples # 只看示例
Get-Command Get-* # 查找以 Get- 开头的命令
Get-Member # 查看对象成员(后面会讲)
2. 变量与数据类型
PowerShell 变量以 $ 开头,不区分类型即可直接赋值(弱类型),也可以强制指定类型。
$name = "张三"
$age = 18
$height = 1.75
$isStudent = $true
# 强类型(不满足会报错)
[int]$num = 100
[string]$text = "hello"
2.1 常用类型
| 类型 | 说明 | 示例 |
|---|---|---|
[int] | 整数 | 10, -5 |
[double] | 浮点数 | 3.14 |
[string] | 字符串 | "hello" |
[bool] | 布尔值 | $true / $false |
[array] | 数组 | 1,2,3 |
[hashtable] | 哈希表 | @{a=1} |
查看类型:
$age.GetType().Name # Int32
2.2 自动变量
PowerShell 内置了许多自动变量:
$PSVersionTable # 当前版本信息
$HOME # 用户主目录
$PWD # 当前目录
$null # 空值
$_ # 管道中的当前对象
3. 运算符
3.1 算术运算符
$a = 10
$b = 3
$a + $b # 13
$a - $b # 7
$a * $b # 30
$a / $b # 3.333...
$a % $b # 1(取余)
3.2 比较运算符
注意:PowerShell 的比较运算符不是
>、<、==,而是以-开头。
10 -eq 10 # 等于 True
10 -ne 5 # 不等于 True
10 -gt 3 # 大于 True
10 -lt 3 # 小于 False
10 -ge 10 # 大于等于 True
10 -le 9 # 小于等于 False
3.3 逻辑运算符
(1 -gt 0) -and (2 -lt 5) # 与 True
(1 -gt 10) -or (2 -lt 5) # 或 True
-not $true # 非 False
3.4 文本匹配运算符
"hello world" -like "hello*" # 通配符匹配 True
"hello world" -match "w.rld" # 正则匹配 True
"abc" -contains "a" # 集合包含
4. 字符串
4.1 单引号与双引号
- 单引号:原样输出,不解析变量。
- 双引号:会解析变量并支持转义。
$name = "张三"
'你好,$name' # 输出:你好,$name
"你好,$name" # 输出:你好,张三
4.2 字符串插值
$age = 18
"年龄是 $age 岁"
# 复杂表达式用 $() 包裹
"明年 $($age + 1) 岁"
4.3 多行字符串(here-string)
$text = @"
第一行
第二行,可以插值 $name
"@
结束的
"@必须顶格,前面不能有空格。
4.4 常用字符串方法
$s = "Hello World"
$s.ToUpper() # HELLO WORLD
$s.ToLower() # hello world
$s.Length # 11
$s.Split(" ") # 按空格拆分
$s.Replace("World","PowerShell")
$s.Substring(0,5) # Hello
$s.Trim() # 去除首尾空白
5. 数组与哈希表
5.1 数组
$arr = 1, 2, 3
$arr = @(1, 2, 3) # 显式声明
$arr[0] # 第一个元素,索引从 0 开始
$arr[-1] # 最后一个元素
$arr.Count # 元素个数
$arr + 4 # 追加元素(生成新数组)
# 遍历
foreach ($item in $arr) {
Write-Output $item
}
5.2 哈希表
键值对集合,使用 @{} 定义:
$user = @{
Name = "张三"
Age = 18
City = "北京"
}
$user["Name"] # 张三
$user.Age # 18(点语法访问)
$user.Keys # 所有键
$user.Values # 所有值
$user["Age"] = 20 # 修改
6. 管道(核心概念)
管道 | 把上一个命令的输出对象传给下一个命令,这是 PowerShell 最强大的特性。
# 获取所有进程 → 筛选名字含 chrome 的 → 按内存排序 → 取前 5 个
Get-Process | Where-Object { $_.Name -like "*chrome*" } |
Sort-Object CPU -Descending | Select-Object -First 5
常用管道命令:
| 命令 | 作用 |
|---|---|
Where-Object | 筛选(类似过滤) |
Select-Object | 选取列 / 取前 N 个 |
Sort-Object | 排序 |
ForEach-Object | 对每个对象执行操作 |
Measure-Object | 统计(求和、平均等) |
Group-Object | 分组 |
示例:
Get-ChildItem | Where-Object { $_.Length -gt 1MB } # 大于 1MB 的文件
Get-Process | Sort-Object CPU -Descending # 按 CPU 排序
1..10 | Measure-Object -Sum # 求和
$_表示管道中当前的对象,$_.属性访问它的属性。
7. 流程控制
7.1 if / elseif / else
$age = 18
if ($age -ge 18) {
"成年人"
} elseif ($age -gt 12) {
"青少年"
} else {
"儿童"
}
7.2 switch
switch ($day) {
"Mon" { "星期一" }
"Tue" { "星期二" }
default { "其他" }
}
7.3 for 循环
for ($i = 1; $i -le 5; $i++) {
Write-Output $i
}
7.4 foreach 循环
foreach ($item in 1..5) {
Write-Output $item
}
7.5 while / do-while
$i = 1
while ($i -le 5) {
Write-Output $i
$i++
}
do {
Write-Output "至少执行一次"
} while ($false)
循环控制:break 跳出整个循环,continue 跳过本次进入下一次。
foreach ($i in 1..10) {
if ($i -eq 5) { break }
Write-Output $i
}
8. 函数
# 定义
function Add-Numbers {
param(
[int]$a,
[int]$b
)
return $a + $b
}
# 调用
Add-Numbers -a 3 -b 5 # 8
Add-Numbers 3 5 # 位置参数也可以
带默认值:
function Greet {
param(
[string]$Name = "世界"
)
"你好,$Name"
}
Greet # 你好,世界
Greet -Name "张三" # 你好,张三
9. 常用命令速览
| 命令 | 说明 | 别名 |
|---|---|---|
Get-ChildItem | 列出目录内容 | ls / dir |
Set-Location | 切换目录 | cd |
Get-Location | 显示当前目录 | pwd |
Get-Content | 读取文件内容 | cat / type |
Set-Content | 写入文件 | — |
Copy-Item | 复制 | cp |
Move-Item | 移动 | mv |
Remove-Item | 删除 | rm / del |
New-Item | 新建文件/目录 | — |
Get-Process | 获取进程 | ps |
Stop-Process | 结束进程 | — |
Get-Service | 获取服务 | — |
Test-Path | 判断路径是否存在 | — |
Clear-Host | 清屏 | cls |
示例:
Get-ChildItem -Path "C:\Users" -Recurse -File # 递归列出所有文件
New-Item -ItemType Directory -Path "demo" # 新建目录
Set-Content -Path "test.txt" -Value "Hello" # 写文件
Get-Content -Path "test.txt" # 读文件
Test-Path "test.txt" # True
10. 注释与执行策略
10.1 注释
# 单行注释
<#
多行注释
可以写很多行
#>
10.2 执行策略
出于安全考虑,Windows 默认禁止运行 .ps1 脚本。查看与设置:
Get-ExecutionPolicy # 查看当前策略
Set-ExecutionPolicy RemoteSigned # 允许本地脚本(推荐,需管理员)
临时绕过(不改系统设置):
powershell -ExecutionPolicy Bypass -File .\script.ps1
11. 综合示例
统计当前目录下各文件类型占用空间:
# 列出当前目录所有文件,按扩展名分组,统计每组总大小
Get-ChildItem -File |
Group-Object Extension |
ForEach-Object {
[PSCustomObject]@{
扩展名 = $_.Name
文件数量 = $_.Count
总大小KB = [math]::Round(($_.Group | Measure-Object Length -Sum).Sum / 1KB, 2)
}
} |
Sort-Object 总大小KB -Descending
12. 学习建议
- 多用
Get-Help和Get-Command,它们是最好的老师。 - 记住「一切皆对象」,善用管道和
Select-Object/Where-Object。 - 比较运算符是
-eq、-gt等,不是==、>。 - 从写小脚本开始,逐步组合成自动化工具。
继续阅读 PowerShell 进阶,学习模块、错误处理、数据格式与自动化。