Day-2-PowerShell基本语法

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. 命令1 执行并产生输出
  2. 输出通过管道传递给命令2
  3. 命令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  # 忽略错误

✍️ 练习任务

基础练习

  1. 命令结构练习

    • 查看所有正在运行的进程
    • 查看所有服务的状态
    • 列出当前目录的所有文件
  2. 参数练习

    • 使用 Get-Process 获取名为 "notepad" 的进程
    • 使用 New-Item 在桌面创建一个名为 "TestFolder" 的文件夹
    • 使用 Stop-Service 停止 "Print Spooler" 服务
  3. 管道练习

    • 获取所有进程,筛选出 CPU 使用时间超过 1 分钟的进程
    • 获取所有服务,只显示已停止的服务
    • 列出当前目录的文件,按文件大小降序排列

进阶练习

  1. 组合命令

    • 找出内存占用超过 50MB 的进程,并按内存使用量降序排列
    • 查找当前目录下所有 .txt 文件,并按修改时间降序排列
    • 获取所有服务,统计运行中和已停止服务的数量
  2. 变量练习

    • 将当前日期存储到变量中,并输出
    • 创建一个包含你的姓名的变量,并输出欢迎信息
    • Get-Process 的结果存储到变量中,然后访问第一个进程的名称

实战挑战

  1. 系统管理任务
    • 创建一个脚本,找出所有占用内存超过 100MB 的进程,并将结果输出到文件
    • 创建一个脚本,查找所有已停止的自动启动服务,并将结果以表格形式显示
    • 创建一个脚本,列出当前目录及其子目录中所有大于 10MB 的文件

💡 常见问题 FAQ

Q1: PowerShell 命令和 CMD 命令有什么区别?

  • A1: PowerShell 使用 cmdlet(动词-名词格式),处理的是对象;CMD 使用传统命令,处理的是纯文本。

Q2: 如何查看一个命令的帮助信息?

  • A2: 使用 Get-Help 命令,如 Get-Help Get-ProcessGet-Help Get-Process -Online 查看在线文档。

Q3: 如何查找所有可用的命令?

  • A3: 使用 Get-Command 查看所有命令,或 Get-Command -Verb Get 查看所有 Get 开头的命令。

Q4: 管道中的 $_ 是什么意思?

  • A4: $_ 表示当前管道对象,在 Where-ObjectForEach-Object 中引用当前正在处理的对象。

Q5: 为什么有些命令需要引号,有些不需要?

  • A5: 如果参数值包含空格或特殊字符,需要用引号括起来。单个单词或数字通常不需要引号。

📚 拓展阅读


🎓 今日总结

PowerShell 的基本语法是掌握 PowerShell 自动化的基础。通过理解 cmdlet 的命名规范、参数的使用、管道的强大功能,你已经可以开始编写简单但强大的自动化脚本了。记住:PowerShell 的核心是对象和管道,善用这两个特性将大大提高你的工作效率。

⏭️ 明天预告: Day 3 – 变量与数据类型,我们将深入学习 PowerShell 的变量系统和各种数据类型。


学习时间: 2026-03-30
课程进度: Day 2 / 30