跳到主要内容

PowerShell 基础入门

PowerShell 是微软推出的跨平台命令行外壳(Shell)和脚本语言,Windows 自带,也可安装在 Linux / macOS 上。 它的核心特点是:一切皆对象,命令之间通过管道传递对象,而不是纯文本。


1. 认识 PowerShell

1.1 与 CMD 的区别

对比项CMD(命令提示符)PowerShell
管道传递内容纯文本对象
命令风格独立小工具统一的「动词-名词」
脚本能力弱(批处理)强(完整语言)
跨平台是(PowerShell 7+)
别名兼容支持 lscdcat

1.2 版本

  • Windows PowerShell 5.1:Windows 自带,仅 Windows。
  • PowerShell 7.xpwsh):跨平台,推荐使用,命令为 pwsh

1.3 启动方式

  • 开始菜单搜索 PowerShellpwsh
  • 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. 学习建议

  1. 多用 Get-HelpGet-Command,它们是最好的老师。
  2. 记住「一切皆对象」,善用管道和 Select-Object / Where-Object
  3. 比较运算符是 -eq-gt 等,不是 ==>
  4. 从写小脚本开始,逐步组合成自动化工具。

继续阅读 PowerShell 进阶,学习模块、错误处理、数据格式与自动化。