PowerShell 完整教程:从入门到精通
PowerShell 不仅仅是一个命令行工具,它是一个功能强大的跨平台任务自动化和配置管理框架,掌握它,将极大地提升你在 Windows、Linux 和 macOS 上的工作效率。
第一部分:初识 PowerShell
什么是 PowerShell?
想象一下,Windows 的传统命令提示符 是一把“瑞士军刀”,能做一些基本操作,而 PowerShell 则是一整套“电动工具箱”。
- 命令提示符: 主要执行简单的、独立的命令。
dir列出文件,copy复制文件。 - PowerShell: 基于 .NET 框架,不仅可以执行命令,更核心的是通过 脚本 来实现复杂的自动化任务,它拥有一个极其丰富的、可扩展的命令集(称为 cmdlet),并且可以操作 .NET 对象,功能远超传统 CMD。
核心特点:
- 对象导向: PowerShell 的命令不处理纯文本,而是处理结构化的 对象,这使得数据传递和处理更加高效和精确。
- 管道: 可以像 Linux/Unix 一样,将一个命令的输出作为另一个命令的输入,实现强大的命令组合。
- 脚本语言: 拥有完整的编程语言语法(变量、函数、循环、条件判断等),可以编写复杂的脚本。
- 跨平台: 现代的 PowerShell (PowerShell Core) 可以在 Windows、Linux 和 macOS 上运行。
- 可扩展性: 可以自己编写 cmdlet,或者使用丰富的社区模块。
如何启动 PowerShell?
在 Windows 上,你有多种方式启动 PowerShell:
- 最推荐的方式: 按
Win + X,然后选择 “Windows PowerShell” 或 “终端” (Windows 10/11 新版,推荐使用终端,它集成了 PowerShell、CMD 和 WSL)。 - 开始菜单: 搜索 "PowerShell"。
- 运行对话框: 按
Win + R,输入powershell,然后回车。
启动后,你会看到一个蓝色的窗口,光标前有一个 PS C:\Users\你的用户名> 的提示符,这表示你当前在 PowerShell 环境中,并且位于你的用户主目录。
第二部分:基础语法与核心概念
命令的基本结构
PowerShell 的核心命令称为 Cmdlet (发音为 "command-let"),它的命名遵循一个严格的规则:
动词-名词
Get-Process: 获取正在运行的进程。Set-Content: 设置文件内容。Stop-Service: 停止一个服务。
这种命名方式使得命令非常直观,易于学习和记忆。
获取帮助
PowerShell 最好的老师就是它自己。Get-Help 是你最重要的命令。
# 获取某个命令的详细帮助 Get-Help Get-Process # 获取命令的基本用法( Get-Help Get-Process -Examples # 获取关于命令参数的详细信息 Get-Help Get-Process -Parameter Name
快捷方式: 在任何命令前加上 man 或 help 效果与 Get-Help 相同,man Get-Process。
使用别名
为了方便用户,PowerShell 为许多常用命令和外部程序提供了简短的别名,就像 Linux 中的 ls, cd 一样。
ls或dir->Get-ChildItem(列出当前目录下的文件和文件夹)cd->Set-Location(切换目录)cp->Copy-Item(复制)mv->Move-Item(移动/重命名)rm->Remove-Item(删除)cls或clear->Clear-Host(清屏)
建议: 初学者可以使用别名快速上手,但为了写出清晰、可维护的脚本,强烈建议使用完整的 动词-名词 命令。
管道
管道是 PowerShell 的精髓,它将一个命令的 输出对象 传递给另一个命令的 输入。
语法: 命令1 | 命令2 | 命令3
示例: 找到所有名称中包含 "chrome" 的进程,并停止它们。
# 1. Get-Process 获取所有进程对象
# 2. Where-Object 筛选出 ProcessName 属性等于 "chrome" 的对象
# 3. Stop-Object 接收这些筛选后的对象,并停止它们
Get-Process | Where-Object { $_.ProcessName -eq "chrome" } | Stop-Process
$_ 是一个自动变量,代表管道中当前正在处理的“当前对象”。
变量
变量用于存储数据,在 PowerShell 中,变量名前必须加上 符号。
# 定义变量 $myName = "张三" $age = 30 $isStudent = $false # 使用变量 Write-Host "你好, $myName! 你今年 $age 岁。" Write-Host "你是否是学生? $isStudent"
PowerShell 的变量可以存储任何类型的数据,包括数字、字符串、布尔值,甚至是复杂的对象。
运算符
- 算术运算符: , , , , (取模)
- 比较运算符:
-eq(等于),-ne(不等于)-gt(大于),-lt(小于),-ge(大于等于),-le(小于等于)-like(通配符匹配),-match(正则表达式匹配)
- 逻辑运算符:
-and(与),-or(或),-not(非)
$number = 10
if ($number -gt 5) {
Write-Host "这个数字大于 5。"
}
# 在 Where-Object 中使用
Get-Process | Where-Object { $_.WorkingSet -gt 100MB } # 找出内存占用超过 100MB 的进程
第三部分:文件与系统管理
这部分是 PowerShell 最常用的场景之一。
文件系统操作
核心命令: Get-ChildItem, Set-Location, New-Item, Copy-Item, Move-Item, Remove-Item
# 切换到 C:\ 盘 Set-Location C:\ # 列出 C:\Windows 目录下的所有 .log 文件 Get-ChildItem C:\Windows -Filter *.log # 创建一个新文件夹 New-Item -Path "C:\temp\MyNewFolder" -ItemType Directory # 创建一个新文件并写入内容 "Hello, PowerShell!" | Out-File -FilePath "C:\temp\MyNewFolder\hello.txt" # 复制文件夹 Copy-Item -Path "C:\temp\MyNewFolder" -Destination "C:\temp\MyNewFolder_Copy" -Recurse # 删除文件夹 (谨慎使用!) # Remove-Item -Path "C:\temp\MyNewFolder_Copy" -Recurse -Force
进程与服务管理
# 列出所有正在运行的进程 Get-Process # 找到并停止记事本进程 Get-Process notepad | Stop-Process # 获取所有 Windows 服务 Get-Service # 停止一个服务 # Stop-Service -Name "spooler" # 启动一个服务 # Start-Service -Name "spooler"
第四部分:编写你的第一个脚本
脚本就是将多个命令保存在一个 .ps1 文件中,然后一次性执行。
创建脚本文件
使用任何文本编辑器(如 VS Code、记事本)创建一个文件,命名为 MyFirstScript.ps1。
编写脚本内容
在 MyFirstScript.ps1 中输入以下代码:
# 这是一个注释
# 1. 定义变量
$computerName = $env:COMPUTERNAME # 获取当前计算机名
$freeSpace = (Get-PSDrive C).Free / 1GB # 获取C盘剩余空间(GB)
# 2. 输出信息
Write-Host "----------------------------------------"
Write-Host " 计算机健康检查报告"
Write-Host "----------------------------------------"
Write-Host "计算机名: $computerName"
Write-Host "C盘剩余空间: $freeSpace GB"
# 3. 条件判断
if ($freeSpace -lt 10) {
Write-Warning "警告:C盘剩余空间不足 10GB!"
} else {
Write-Host "C盘空间充足。"
}
Write-Host "----------------------------------------"
执行脚本
默认情况下,为了安全,PowerShell 禁止直接运行脚本,你需要先设置执行策略。
步骤 1: 设置执行策略
以管理员身份打开 PowerShell,然后运行:
# 设置为 "RemoteSigned" 意味着本地创建的脚本可以运行,但从网上下载的脚本需要经过签名。 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # 输入 Y 确认
步骤 2: 运行脚本
在 PowerShell 中,导航到你的脚本所在的目录,然后执行:
# 进入脚本所在目录 Set-Path C:\path\to\your\script # 执行脚本 .\MyFirstScript.ps1
注意: .\ 表示在当前目录下查找脚本,这是在 PowerShell 中运行本地脚本的正确方式。
第五部分:进阶主题
函数
函数是用来封装一段可重用代码的块,它像一个小型的脚本,可以有输入参数和返回值。
function Get-ComputerInfo {
param(
[string]$ComputerName = $env:COMPUTERNAME # 参数,带默认值
)
$os = Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $ComputerName
$cpu = Get-CimInstance -ClassName Win32_Processor -ComputerName $ComputerName
[PSCustomObject]@{
ComputerName = $ComputerName
OSVersion = $os.Caption
CPUBrand = $cpu.Name
TotalRAM = "{0:N2} GB" -f ($os.TotalVisibleMemorySize / 1MB)
}
}
# 使用函数
$info = Get-ComputerInfo
$info | Format-List
# 带参数使用
# $remoteInfo = Get-ComputerInfo -ComputerName "Server01"
# $remoteInfo | Format-List
模块
模块是 PowerShell 功能的扩展包,它将相关的 cmdlet、函数和脚本打包在一起,你可以从 PowerShell Gallery 安装海量第三方模块。
安装模块示例 (需要管理员权限):
# 安装用于管理 Azure 的模块 Install-Module -Name Az -Scope AllUsers -Force
使用模块:
安装后,相关的命令会自动加载,你就可以像使用内置命令一样使用它们了。
错误处理
在自动化脚本中,错误处理至关重要,使用 try-catch 块来捕获和处理错误。
try {
# 尝试执行一个可能失败的操作
Get-Service -Name "ThisServiceDoesNotExist"
Write-Host "服务找到。"
}
catch {
# 如果发生错误,执行这里的代码
Write-Warning "发生错误: $($_.Exception.Message)"
}
finally {
# 无论是否发生错误,这里的代码都会执行
Write-Host "检查完成。"
}
第六部分:学习资源与最佳实践
官方资源
- PowerShell 文档: https://docs.microsoft.com/zh-cn/powershell/ - 最权威、最全面的资料。
- PowerShell Gallery: https://www.powershellgallery.com/ - 查找和安装模块的官方仓库。
社区与学习网站
- Learn PowerShell in a Month of Lunches (书籍): 经典入门书籍,有中文版。
- The Posh Code (博客): https://poshcode.org/ - 收集了大量 PowerShell 脚本和示例。
- Stack Overflow: 标签 powershell。
最佳实践
- 使用
Get-Help: 遇到任何不熟悉的命令,先查帮助。 - 从命令行开始: 先在命令行上组合命令,确保逻辑正确后再写入脚本。
- 多使用管道: 充分利用管道的威力,写出简洁高效的代码。
- 注释你的代码: 为复杂的逻辑添加注释,方便自己和他人理解。
Write-Verbose和Write-Debug: 在脚本中使用这些命令来输出调试信息,而不是直接用Write-Host。- 模块化: 将复杂的脚本拆分成多个小函数,并封装成模块。
PowerShell 是一个极其强大的工具,学习曲线可能有些陡峭,但一旦掌握,它将成为你日常工作中不可或缺的利器,从今天开始,尝试用 PowerShell 替代你平时在 CMD 中执行的简单任务,逐步感受它的强大与优雅,祝你学习愉快!
