Day 2: PowerShell基本语法
🎯 学习目标
- 理解 PowerShell 的基本语法结构
- 掌握命令的组成要素
- 学会使用 cmdlet(命令let)
- 理解参数和参数值的概念
- 掌握管道(Pipeline)的使用
- 学会基本的输出和输入操作
💡 核心概念
1. PowerShell 命令的结构
PowerShell 的命令遵循一个统一的命名规范,称为 cmdlet(读作"command-let")。理解 cmdlet 的结构是掌握 PowerShell 的第一步。
1.1 Cmdlet 命名规范
所有 PowerShell cmdlet 都遵循 动词-名词 的命名格式:
动词-名词
示例:
Get-Process(获取进程)Stop-Service(停止服务)New-Item(新建项目)Remove-File(删除文件)
常用动词:
| 动词 | 含义 | 示例 |
|---|---|---|
| Get | 获取/查询 | Get-Process, Get-Service |
| Set | 设置/修改 | Set-Location, Set-Variable |
| New | 新建/创建 | New-Item, New-Directory |
| Remove | 删除 | Remove-Item, Remove-Variable |
| Start | 启动 | Start-Service, Start-Process |
| Stop | 停止 | Stop-Service, Stop-Process |
| Test | 测试/检查 | Test-Path, Test-Connection |
| Export | 导出 | Export-Csv, Export-Excel |
| Import | 导入 | Import-Csv, Import-Module |
名词通常表示操作的对象,如 Process(进程)、Service(服务)、File(文件)等。
2. 命令的基本格式
完整的 PowerShell 命令由以下部分组成:
Cmdlet名称 -参数名 参数值 -参数名 参数值 ...
示例:
# 获取名为"chrome"的进程
Get-Process -Name "chrome"
# 在当前目录新建一个文件夹
New-Item -Path ".\新文件夹" -ItemType "Directory"
# 停止名为"Spooler"的服务
Stop-Service -Name "Spooler"
格式说明:
- Cmdlet 名称和参数名之间用空格分隔
- 参数名前必须加
-(减号) - 参数值紧跟在参数名后面,用空格分隔
- 如果参数值包含空格,需要用引号括起来
3. 参数(Parameters)
参数是用来向命令传递额外信息的方式。PowerShell 的参数分为以下几类:
3.1 参数类型
位置参数:
# 以下两个命令等效
Get-Process -Name "chrome"
Get-Process "chrome" # Name 是位置参数,可以省略参数名
命名参数:
# 必须指定参数名
New-Item -Path "C:\Test" -ItemType "Directory"
开关参数(Switch Parameters):
# 不需要参数值,表示开启或关闭某个功能
Get-ChildItem -Recurse # 递归列出所有子目录
Get-Process -Name "chrome" -ComputerName "Server01"
常用参数:
| 参数 | 说明 | 示例 |
|---|---|---|
| -Name | 指定名称 | Get-Process -Name "chrome" |
| -Path | 指定路径 | New-Item -Path "C:\Test" |
| -Value | 指定值 | Set-Variable -Name "x" -Value 10 |
| -Force | 强制执行 | Remove-Item -Path "C:\Test" -Force |
| -Recurse | 递归操作 | Get-ChildItem -Recurse |
| -Verbose | 显示详细信息 | Get-Process -Verbose |
4. 引号的使用
在 PowerShell 中,引号用于处理包含空格或特殊字符的文本。
4.1 单引号 vs 双引号
单引号 ':字面字符串(不解析变量)
$name = "张三"
Write-Output '我的名字是 $name' # 输出:我的名字是 $name
双引号 ":可扩展字符串(解析变量)
$name = "张三"
Write-Output "我的名字是 $name" # 输出:我的名字是 张三
何时使用引号:
# ✅ 需要引号:参数值包含空格
New-Item -Path "C:\Program Files\Test"
# ✅ 需要引号:参数值是文本字符串
Write-Output "Hello World"
# ❌ 不需要引号:参数值是单个单词
Get-Process -Name chrome
# ❌ 不需要引号:参数值是数字
Set-Variable -Name x -Value 10
5. 管道(Pipeline)
管道是 PowerShell 最强大的特性之一,它允许你将一个命令的输出传递给下一个命令作为输入。
5.1 管道符号 |
基本语法:
命令1 | 命令2
工作原理:
- 命令1 执行并产生输出
- 输出通过管道传递给命令2
- 命令2 使用命令1的输出作为输入
示例:
# 获取所有进程,然后筛选出名称包含"chrome"的进程
Get-Process | Where-Object { $_.Name -like "*chrome*" }
# 获取所有服务,然后只显示运行中的服务
Get-Service | Where-Object { $_.Status -eq "Running" }
# 获取当前目录的文件,然后按文件大小排序
Get-ChildItem | Sort-Object Length -Descending
# 获取进程列表,然后选择前10个
Get-Process | Select-Object -First 10
管道的优势:
- 将复杂任务分解为简单步骤
- 提高命令的可读性
- 减少中间变量的使用
- 提高代码的可维护性
6. 对象(Objects)
PowerShell 与传统的命令行工具不同,它处理的是对象而不是纯文本。
6.1 对象的概念
每个 PowerShell 命令的输出都是对象,对象具有:
- 属性(Properties):存储数据
- 方法(Methods):执行操作
示例:
# 获取进程对象
$process = Get-Process -Name "chrome"
# 访问属性
$process.Id # 进程ID
$process.Name # 进程名称
$process.CPU # CPU使用时间
$process.WorkingSet64 # 内存使用量
# 调用方法
$process.Kill() # 终止进程
$process.Refresh() # 刷新进程信息
6.2 查看对象的属性和方法
# 查看进程对象的所有成员
Get-Process | Get-Member
# 只查看属性
Get-Process | Get-Member -MemberType Properties
# 只查看方法
Get-Process | Get-Member -MemberType Methods
7. 变量(Variables)
变量用于存储数据,以便在脚本中重复使用。
7.1 变量的命名和赋值
变量名规则:
- 必须以
$符号开头 - 可以包含字母、数字、下划线
- 区分大小写
- 不能以数字开头
示例:
# 赋值
$name = "张三"
$age = 30
$isStudent = $false
# 使用变量
Write-Output "我的名字是 $name,今年 $age 岁"
7.2 常用变量操作
# 查看变量值
$name
# 删除变量
Remove-Variable name
# 查看所有变量
Get-Variable
# 查看特定变量
Get-Variable -Name name
8. 输出命令
PowerShell 提供了多个输出命令,用于在控制台显示信息。
8.1 Write-Output
# 输出文本
Write-Output "Hello World"
# 输出变量
$name = "张三"
Write-Output $name
# 输出表达式
Write-Output (1 + 1)
8.2 Write-Host
# 输出带颜色的文本
Write-Host "错误信息" -ForegroundColor Red
Write-Host "成功信息" -ForegroundColor Green
Write-Host "警告信息" -ForegroundColor Yellow
# 输出到主机的文本不会被管道传递
Write-Host "这条信息不会被管道传递"
8.3 输出重定向
# 输出到文件
Get-Process > process.txt
# 追加到文件
Get-Process >> process.txt
# 错误输出重定向
Get-Process -Name "nonexistent" 2> error.txt
🎮 实战示例
示例 1: 查询和管理进程
# 1. 获取所有进程
Get-Process
# 2. 获取特定进程
Get-Process -Name "chrome"
# 3. 筛选 CPU 使用率高的进程
Get-Process | Where-Object { $_.CPU -gt 10 }
# 4. 按内存使用量排序,显示前10个
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 10
# 5. 停止特定进程
Stop-Process -Name "notepad" -Force
示例 2: 文件和文件夹操作
# 1. 查看当前目录的内容
Get-ChildItem
# 2. 递归列出所有文件和子目录
Get-ChildItem -Recurse
# 3. 只列出文件
Get-ChildItem -File
# 4. 只列出目录
Get-ChildItem -Directory
# 5. 查找特定类型的文件
Get-ChildItem -Filter "*.txt"
# 6. 新建文件夹
New-Item -Path ".\新文件夹" -ItemType "Directory"
# 7. 新建文件
New-Item -Path ".\新文件夹\test.txt" -ItemType "File"
# 8. 删除文件
Remove-Item -Path ".\新文件夹\test.txt"
示例 3: 服务管理
# 1. 查看所有服务
Get-Service
# 2. 查看运行中的服务
Get-Service | Where-Object { $_.Status -eq "Running" }
# 3. 启动服务
Start-Service -Name "Spooler"
# 4. 停止服务
Stop-Service -Name "Spooler"
# 5. 重启服务
Restart-Service -Name "Spooler"
示例 4: 组合命令(管道实战)
# 任务1:找出内存占用超过100MB的进程
Get-Process | Where-Object { $_.WorkingSet64 -gt 100MB }
# 任务2:查看所有已停止的服务
Get-Service | Where-Object { $_.Status -eq "Stopped" }
# 任务3:查找大文件(超过10MB)
Get-ChildItem -Recurse -File | Where-Object { $_.Length -gt 10MB }
# 任务4:统计当前目录下各类型文件的数量
Get-ChildItem -File | Group-Object Extension
# 任务5:查找7天内修改过的文件
Get-ChildItem -Recurse -File | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) }
⚠️ 重要注意事项
1. 大小写敏感性
PowerShell 不区分大小写,但建议保持一致性:
# 以下命令等效
GET-PROCESS
Get-Process
get-process
# 建议使用 Pascal Case(首字母大写)
Get-Process # ✅ 推荐
2. 命令的分号
PowerShell 不需要使用分号 ; 来结束命令:
# ❌ 不需要分号
Get-Process;
# ✅ 推荐
Get-Process
但如果在一行中写多个命令,需要用分号分隔:
Get-Process; Get-Service # 一行执行两个命令
3. 注释
单行注释:
# 这是单行注释
Get-Process # 这也是注释
多行注释:
<#
这是多行注释
可以跨越多行
#>
4. 命令续行
如果命令太长,可以使用反引号 ` 来续行:
Get-Process | Where-Object { $_.CPU -gt 10 } `
| Sort-Object CPU -Descending `
| Select-Object -First 10
5. 错误处理
# 使用 -ErrorAction 参数控制错误行为
Get-Process -Name "nonexistent" -ErrorAction SilentlyContinue # 静默继续
Get-Process -Name "nonexistent" -ErrorAction Stop # 遇到错误停止
Get-Process -Name "nonexistent" -ErrorAction Ignore # 忽略错误
✍️ 练习任务
基础练习
-
命令结构练习
- 查看所有正在运行的进程
- 查看所有服务的状态
- 列出当前目录的所有文件
-
参数练习
- 使用
Get-Process获取名为 "notepad" 的进程 - 使用
New-Item在桌面创建一个名为 "TestFolder" 的文件夹 - 使用
Stop-Service停止 "Print Spooler" 服务
- 使用
-
管道练习
- 获取所有进程,筛选出 CPU 使用时间超过 1 分钟的进程
- 获取所有服务,只显示已停止的服务
- 列出当前目录的文件,按文件大小降序排列
进阶练习
-
组合命令
- 找出内存占用超过 50MB 的进程,并按内存使用量降序排列
- 查找当前目录下所有 .txt 文件,并按修改时间降序排列
- 获取所有服务,统计运行中和已停止服务的数量
-
变量练习
- 将当前日期存储到变量中,并输出
- 创建一个包含你的姓名的变量,并输出欢迎信息
- 将
Get-Process的结果存储到变量中,然后访问第一个进程的名称
实战挑战
- 系统管理任务
- 创建一个脚本,找出所有占用内存超过 100MB 的进程,并将结果输出到文件
- 创建一个脚本,查找所有已停止的自动启动服务,并将结果以表格形式显示
- 创建一个脚本,列出当前目录及其子目录中所有大于 10MB 的文件
💡 常见问题 FAQ
Q1: PowerShell 命令和 CMD 命令有什么区别?
- A1: PowerShell 使用 cmdlet(动词-名词格式),处理的是对象;CMD 使用传统命令,处理的是纯文本。
Q2: 如何查看一个命令的帮助信息?
- A2: 使用
Get-Help命令,如Get-Help Get-Process或Get-Help Get-Process -Online查看在线文档。
Q3: 如何查找所有可用的命令?
- A3: 使用
Get-Command查看所有命令,或Get-Command -Verb Get查看所有 Get 开头的命令。
Q4: 管道中的 $_ 是什么意思?
- A4:
$_表示当前管道对象,在Where-Object或ForEach-Object中引用当前正在处理的对象。
Q5: 为什么有些命令需要引号,有些不需要?
- A5: 如果参数值包含空格或特殊字符,需要用引号括起来。单个单词或数字通常不需要引号。
📚 拓展阅读
🎓 今日总结
PowerShell 的基本语法是掌握 PowerShell 自动化的基础。通过理解 cmdlet 的命名规范、参数的使用、管道的强大功能,你已经可以开始编写简单但强大的自动化脚本了。记住:PowerShell 的核心是对象和管道,善用这两个特性将大大提高你的工作效率。
⏭️ 明天预告: Day 3 – 变量与数据类型,我们将深入学习 PowerShell 的变量系统和各种数据类型。
学习时间: 2026-03-30
课程进度: Day 2 / 30