Windows PowerShell 基础教程:从零开始
引言:告别重复,拥抱自动化
在日常使用或管理 Windows 系统时,你是否常常感到有些操作繁琐、重复?比如批量重命名文件、查找特定类型的日志、检查系统状态、安装软件等。如果你一直在手动点击鼠标完成这些任务,那么是时候了解一个强大的工具了:Windows PowerShell。
对于许多初学者来说,命令行界面(CLI)可能看起来令人望而生畏,一堆字符闪烁在黑底白字(或蓝底白字)的窗口中。但请相信,掌握 PowerShell 就像学会一门新的语言,它能让你与 Windows 系统进行更高效、更直接的对话,极大地提升你的工作效率,尤其是在系统管理、自动化任务、数据处理等方面。
本教程将带你从零开始认识和使用 PowerShell,从最基本的概念到常用的命令,再到简单的数据处理和脚本编写,让你逐步掌握这个强大的工具。
第一章:初识 PowerShell
1.1 什么是 PowerShell?
简单来说,PowerShell 是一个由微软开发的任务自动化和配置管理框架,它包含了一个命令行 Shell 和一种脚本语言。与传统的命令提示符(Command Prompt, CMD)不同,PowerShell 基于 .NET Framework 构建,其核心优势在于它处理的不是简单的文本流,而是结构化的对象。
1.2 PowerShell 与 CMD 的区别
这是初学者最常问的问题。虽然两者都可以执行命令,但底层机制和能力有着本质区别:
- 处理单元不同:
- CMD: 主要处理文本。一个命令的输出是文本,下一个命令如果想利用上一个命令的结果,需要通过解析文本来实现,这通常比较复杂且容易出错。
- PowerShell: 主要处理对象。一个命令的输出是具有属性(Properties)和方法(Methods)的结构化对象。你可以轻松地访问、过滤、排序和操作这些对象的属性,而无需进行复杂的文本解析。
- 命令体系不同:
- CMD: 基于传统的 DOS 命令,命令数量有限,功能相对基础。
- PowerShell: 基于 Cmdlet(命令小程序)。Cmdlet 遵循“动词-名词”的命名规范(如
Get-Process
),更具可读性和一致性。PowerShell 拥有大量的内置 Cmdlet,还可以通过模块无限扩展,涵盖系统管理的方方面面。
- 脚本能力:
- CMD: 批处理脚本(.bat 或 .cmd)功能相对较弱,语法古老。
- PowerShell: 拥有功能丰富的脚本语言,支持变量、数据类型、条件判断、循环、函数等高级编程特性,可以编写复杂的自动化脚本。
- 可发现性与帮助系统:
- CMD: 帮助信息通常很简单。
- PowerShell: 拥有强大的内置帮助系统(
Get-Help
),可以详细查询 Cmdlet 的用法、参数和示例,极大地降低了学习难度。
总而言之,PowerShell 是 CMD 的强大升级,它更现代、更强大、更灵活,是 Windows 系统管理和自动化的未来。
1.3 为什么要学习 PowerShell?
- 提高效率: 自动化重复性任务,批量处理文件、用户、计算机设置等。
- 系统管理: 轻松管理本地和远程 Windows 服务器和客户端。
- 故障排除: 快速获取系统信息、诊断问题。
- 软件部署与配置: 编写脚本自动化软件安装和系统配置。
- 跨平台(PowerShell Core): PowerShell 不再仅限于 Windows,PowerShell Core (PowerShell 6 及更高版本) 已支持 Linux 和 macOS。
- 职业发展: 在 IT 系统管理、自动化运维等领域,PowerShell 是必备技能。
第二章:启动 PowerShell
启动 PowerShell 有多种方法,选择你最习惯的一种:
- 通过搜索栏: 点击任务栏搜索图标或按
Win + S
,输入 “PowerShell”,然后点击 “Windows PowerShell”。 - 通过运行窗口: 按
Win + R
打开运行窗口,输入powershell
,按回车。 - 通过文件资源管理器: 在文件资源管理器中,在地址栏输入
powershell
并按回车,会在当前文件夹路径下打开 PowerShell。或者,在文件资源管理器中,按住Shift
键,右键点击文件夹空白处,选择 “在此处打开 PowerShell 窗口” (较新版本可能显示 “在此处打开终端”,然后默认打开 PowerShell)。 - 以管理员身份运行: 对于需要执行系统级任务的操作,通常需要以管理员身份运行 PowerShell。在搜索结果中找到 “Windows PowerShell”,右键点击,选择 “以管理员身份运行”。你会看到窗口标题栏包含 “管理员” 字样。
启动后,你会看到一个命令行窗口,其中包含一个提示符(Prompt),通常是当前路径加上 >
符号,例如:
PS C:\Users\YourUserName>
PS
表示你当前正在使用 PowerShell。
第三章:PowerShell 的核心概念
掌握 PowerShell,必须理解以下几个核心概念:
3.1 Cmdlet (命令小程序)
Cmdlet 是 PowerShell 中最基本的命令单元。它们的命名非常规范和一致,通常遵循“动词-名词”的格式,中间用连字符 -
连接。
- 动词 (Verb): 表示要执行的操作,如
Get
(获取)、Set
(设置)、New
(新建)、Remove
(移除)、Start
(启动)、Stop
(停止) 等。这些动词是标准化的,你可以通过Get-Verb
Cmdlet 查看所有标准动词。 - 名词 (Noun): 表示操作的对象,如
Process
(进程)、Service
(服务)、File
(文件)、Item
(项目)、Command
(命令) 等。
例子:
Get-Process
: 获取当前正在运行的进程信息。Stop-Service
: 停止一个正在运行的服务。New-Item
: 创建一个新的文件或文件夹。Remove-Item
: 删除一个文件或文件夹。
这种命名方式使得 Cmdlet 的功能一目了然,非常易于记忆和猜测。
3.2 对象 (Object)
这是 PowerShell 与 CMD 最核心的区别。当一个 Cmdlet 执行后,它不会简单地输出一堆文本,而是输出一个或多个对象。每个对象都包含了一系列属性 (Properties) 和可能的操作方法 (Methods)。
例子: 执行 Get-Process
,它不会只给你进程的名字,而是会输出一个或多个进程对象。每个进程对象都包含诸如 Name
(名称)、ID
(进程ID)、CPU
(CPU占用率)、Memory
(内存占用) 等属性。
你可以使用 Get-Member
Cmdlet 来查看一个对象有哪些属性和方法。例如:
powershell
Get-Process | Get-Member
(稍后我们会讲解 |
管道的用法)
理解对象的重要性在于,你可以直接访问和操作这些结构化的数据,而无需进行复杂的文本解析。这让数据过滤、排序和进一步处理变得非常容易。
3.3 管道 (Pipeline)
管道是 PowerShell 中一个极其强大的特性,使用符号 |
表示。它允许你将一个 Cmdlet 的输出对象作为另一个 Cmdlet 的输入。
语法:
powershell
Cmdlet-A | Cmdlet-B | Cmdlet-C ...
Cmdlet-A
执行并将输出的对象传递给 Cmdlet-B
。Cmdlet-B
对接收到的对象进行处理,然后将其输出传递给 Cmdlet-C
,依此类推。
例子:
Get-Process | Stop-Process
: 获取进程对象,然后停止这些进程(这需要谨慎使用,并指定要停止的进程)。Get-Service | Where-Object {$_.Status -eq 'Running'}
: 获取所有服务对象,然后将其中状态为 ‘Running’ 的服务对象过滤出来。Get-ChildItem | Sort-Object LastWriteTime -Descending
: 获取当前目录下的所有文件和文件夹对象,然后按最后修改时间倒序排序。
管道和对象的结合是 PowerShell 强大的基石,它使得组合简单的命令来完成复杂任务成为可能。
3.4 参数 (Parameters)
Cmdlet 通常接受参数来修改其行为。参数名前面使用连字符 -
。
语法:
powershell
Cmdlet-Name -ParameterName 参数值 -AnotherParameterName AnotherParameterValue
有些参数是必需的,有些是可选的。有些参数可以接受多个值,有些是开关参数(Presence Parameter),只需要列出参数名即可,不需要值(表示启用该功能)。
例子:
Get-ChildItem -Path C:\Windows
: 获取C:\Windows
目录下的项目。-Path
是参数名,C:\Windows
是参数值。Stop-Process -Name notepad
: 停止名为 “notepad” 的进程。-Name
是参数。Get-Service -DisplayName *sql*
: 获取显示名称中包含 “sql” 的服务。-DisplayName
是参数,*sql*
是参数值,使用了通配符*
。Get-ChildItem -Recurse
: 获取当前目录及其所有子目录下的项目。-Recurse
是一个开关参数,表示递归查找。
第四章:获取帮助
在你学习和使用 PowerShell 的过程中,获取帮助是最重要也是最常用的操作之一。PowerShell 内置了强大的帮助系统。
4.1 Get-Help
Cmdlet
Get-Help
是你的好朋友。它可以用来查询 Cmdlet 的详细信息、参数、示例等。
基本用法:
powershell
Get-Help Cmdlet-Name
例子:
powershell
Get-Help Get-Process
这将显示 Get-Process
的简要描述、语法和备注。
获取更多信息:
-Detailed
: 显示参数的详细描述。
powershell
Get-Help Get-Process -Detailed-Examples
: 显示 Cmdlet 的使用示例。
powershell
Get-Help Get-Process -Examples-Full
: 显示所有详细信息,包括参数、示例、输入/输出类型等。
powershell
Get-Help Get-Process -Full-Online
: 在默认浏览器中打开 Cmdlet 的最新在线帮助文档(强烈推荐)。
powershell
Get-Help Get-Process -Online
更新帮助文档:
PowerShell 的帮助文档可以离线使用,但可能不是最新的。你可以定期更新它们:
powershell
Update-Help
首次运行可能需要管理员权限,且需要联网下载。
查找 Cmdlet:
如果你不知道要使用哪个 Cmdlet,可以结合通配符使用 Get-Help
来查找:
powershell
Get-Command *Process* # 查找所有名称中包含 "Process" 的 Cmdlet
Get-Command -Noun Service # 查找所有名词是 "Service" 的 Cmdlet
Get-Command -Verb Get # 查找所有动词是 "Get" 的 Cmdlet
Get-Command
是用来查找 Cmdlet 本身的,而 Get-Help
是用来获取 Cmdlet 使用方法的。两者经常配合使用。
第五章:常用基础命令 (Cmdlets)
现在,我们来学习一些最基础和最常用的 Cmdlet。
5.1 文件系统操作
这部分 Cmdlet 类似于 CMD 或 Linux 中的文件操作命令。PowerShell 为了一些兼容性,保留了许多 CMD/Linux 的别名。
- 获取当前位置:
- Cmdlet:
Get-Location
- 别名:
gl
,pwd
(Print Working Directory) - 用法:
Get-Location
或pwd
- Cmdlet:
- 设置位置 (切换目录):
- Cmdlet:
Set-Location
- 别名:
sl
,cd
(Change Directory),chdir
- 用法:
Set-Location C:\Windows
或cd C:\Windows
- 返回上一级:
cd ..
- 返回根目录:
cd \
(Windows) 或cd /
(Linux/macOS PowerShell Core)
- Cmdlet:
- 获取目录内容 (列出文件和文件夹):
- Cmdlet:
Get-ChildItem
- 别名:
gci
,ls
(List Segments),dir
(Directory) - 用法:
Get-ChildItem
或ls
(当前目录)Get-ChildItem C:\Windows
(指定目录)Get-ChildItem -Path C:\Scripts\*.ps1
(使用通配符查找特定文件)Get-ChildItem -Recurse
(递归查找子目录)Get-ChildItem -Force
(显示隐藏和系统文件/文件夹)
- Cmdlet:
- 创建项目 (文件或文件夹):
- Cmdlet:
New-Item
- 用法:
New-Item -Path .\NewFolder -ItemType Directory
(创建文件夹)New-Item -Path .\NewFile.txt -ItemType File
(创建文件)
- Cmdlet:
- 复制项目:
- Cmdlet:
Copy-Item
- 别名:
copy
,cp
- 用法:
Copy-Item .\File.txt .\NewFolder\
(复制文件到文件夹) - 用法:
Copy-Item .\Folder1 .\Folder2 -Recurse
(递归复制文件夹)
- Cmdlet:
- 移动项目:
- Cmdlet:
Move-Item
- 别名:
move
,mv
- 用法:
Move-Item .\File.txt ..\
(移动文件到上一级目录)
- Cmdlet:
- 重命名项目:
- Cmdlet:
Rename-Item
- 别名:
ren
- 用法:
Rename-Item .\OldName.txt NewName.txt
- Cmdlet:
- 删除项目:
- Cmdlet:
Remove-Item
- 别名:
del
,erase
,rd
,rm
,rmdir
- 用法:
Remove-Item .\File.txt
(删除文件)Remove-Item .\NewFolder
(删除空文件夹)Remove-Item .\NonEmptyFolder -Recurse -Force
(删除非空文件夹及其内容,谨慎使用!)
- Cmdlet:
5.2 内容操作
- 获取文件内容:
- Cmdlet:
Get-Content
- 别名:
gc
,cat
,type
- 用法:
Get-Content .\MyFile.txt
(显示文件内容) - 用法:
Get-Content .\MyLog.log -Tail 10
(显示文件末尾10行)
- Cmdlet:
- 设置文件内容 (覆盖):
- Cmdlet:
Set-Content
- 别名:
sc
- 用法:
Set-Content .\NewFile.txt "这是新内容"
(创建或覆盖文件内容)
- Cmdlet:
- 添加文件内容 (追加):
- Cmdlet:
Add-Content
- 别名:
ac
- 用法:
Add-Content .\ExistingFile.txt "这是追加的内容"
(向文件末尾追加内容)
- Cmdlet:
5.3 变量
变量用于存储数据。在 PowerShell 中,变量名前面使用美元符号 $
。变量没有固定的数据类型,PowerShell 会根据赋给它的值自动判断。
- 创建和赋值:
$myVariable = "Hello, PowerShell!"
$number = 123
$date = Get-Date
(将Get-Date
命令的输出对象赋给变量)
- 使用变量:
Write-Host $myVariable
(在控制台输出变量的值)"今天日期是: $($date)"
(在字符串中使用变量,建议用$()
包裹复杂变量或表达式)Get-ChildItem -Path $myFolderPath
(将变量作为命令参数)
5.4 基本输入输出
- 输出到控制台:
- Cmdlet:
Write-Host
- 用法:
Write-Host "欢迎来到 PowerShell!"
- Cmdlet:
- 读取用户输入:
- Cmdlet:
Read-Host
- 用法:
powershell
$userName = Read-Host "请输入你的名字"
Write-Host "你好,$userName!"
- Cmdlet:
第六章:深入理解对象与管道
掌握如何利用对象的属性和方法以及如何使用管道是 PowerShell 进阶的关键。
6.1 使用管道结合其他 Cmdlet
还记得前面提到的对象吗? Cmdlet 输出的对象可以包含许多信息。通过管道,我们可以将这些信息传递给其他 Cmdlet 进行进一步处理。
- 获取对象成员 (
Get-Member
): 查看对象的属性 (Property) 和方法 (Method)。
powershell
Get-Process | Get-Member
输出会告诉你进程对象有哪些属性(如Name
、Id
、CPU
)和方法(如Kill
、Refresh
)。 - 选择对象属性 (
Select-Object
): 只保留你感兴趣的属性(列)。- 别名:
select
powershell
Get-Process | Select-Object Name, ID, CPU
这将列出所有进程,但只显示它们的名称、ID 和 CPU 占用率。
powershell
Get-Service | Select-Object -First 5 Name, Status
获取前5个服务,并显示它们的名称和状态。
- 别名:
- 过滤对象 (
Where-Object
): 根据对象的属性值进行筛选。- 别名:
where
,?
- 语法格式通常是
Where-Object {$_.属性名 比较运算符 值}
。$_
代表当前正在通过管道传递的对象。 - 比较运算符:
-eq
(等于)-ne
(不等于)-gt
(大于)-lt
(小于)-ge
(大于等于)-le
(小于等于)-like
(匹配通配符,如*
、?
)-notlike
(不匹配通配符)-match
(匹配正则表达式)-notmatch
(不匹配正则表达式)
- 用法:
powershell
Get-Process | Where-Object {$_.CPU -gt 10} # 查找 CPU 占用大于 10 的进程
Get-Service | Where-Object {$_.Status -eq 'Running'} # 查找正在运行的服务
Get-ChildItem | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-7)} # 查找最近7天内修改的文件/文件夹
Get-Process | Where-Object {$_.Name -like 'c*'} # 查找名称以 'c' 开头的进程
- 别名:
- 排序对象 (
Sort-Object
): 根据对象的属性值进行排序。- 别名:
sort
powershell
Get-Process | Sort-Object CPU -Descending # 按 CPU 占用率降序排序
Get-ChildItem | Sort-Object LastWriteTime # 按最后修改时间升序排序 (默认)
- 别名:
- 格式化输出 (
Format-*
): 改变对象在控制台的显示方式。注意,这些命令会销毁对象的结构,输出变为格式化的文本,通常放在管道的最后一步。Format-Table
(ft
):以表格形式显示 (默认通常是这个)。Format-List
(fl
):以列表形式显示每个对象的每个属性,适合查看详细信息。Format-Wide
(fw
):只显示一个属性,多列显示,适合只看名称等简单信息。
powershell
Get-Process | Format-List Name, ID, Path # 以列表形式显示特定属性
Get-Service | Format-Wide Name # 只显示服务名称
第七章:第一个 PowerShell 脚本
虽然你可以在命令行中直接输入 Cmdlet,但对于更复杂的任务,将命令保存在脚本文件中更加方便和可重用。
7.1 什么是 PowerShell 脚本?
PowerShell 脚本是一个包含一系列 PowerShell 命令的文本文件,文件扩展名为 .ps1
。你可以像运行单个命令一样运行脚本文件,PowerShell 会按顺序执行其中的命令。
7.2 编写脚本
你可以使用任何文本编辑器(如记事本)编写 PowerShell 脚本,但更推荐使用专门的工具,如 PowerShell ISE (Integrated Scripting Environment) 或 Visual Studio Code (安装 PowerShell 扩展)。这些工具提供了语法高亮、代码智能提示、调试功能等,极大地提高了编写效率。
示例脚本 (MyFirstScript.ps1):
“`powershell
这是一个简单的 PowerShell 脚本
脚本功能:获取当前日期时间并输出
Write-Host “运行脚本:获取当前日期和时间”
获取当前日期和时间对象
$currentDateTime = Get-Date
输出日期时间
Write-Host “当前日期和时间是: $($currentDateTime)”
稍作等待
Start-Sleep -Seconds 2
获取系统信息并输出部分内容
Write-Host “n获取一些系统信息:" #
n 表示换行
Get-ComputerInfo | Select-Object OsName, OsVersion, OsHardwareAbstractionLayer | Format-List
Write-Host “`n脚本执行完毕。”
“`
将上面的代码保存为一个 .ps1
文件,例如 MyFirstScript.ps1
。
7.3 执行脚本
默认情况下,为了安全起见,Windows 不允许直接双击运行 .ps1
脚本文件(它会打开记事本)。你需要在 PowerShell 窗口中执行脚本。
要执行一个脚本文件,你需要提供它的完整路径或相对路径。
- 在当前目录下执行: 如果脚本文件在当前 PowerShell 所在的目录下,使用
./
表示当前目录:
powershell
.\MyFirstScript.ps1 - 使用完整路径执行:
powershell
C:\Path\To\Your\Scripts\MyFirstScript.ps1
7.4 执行策略 (Execution Policy)
当你第一次尝试执行脚本时,可能会遇到错误信息,提示脚本无法运行,这通常是由于 PowerShell 的执行策略 (Execution Policy) 阻止了脚本的运行。
执行策略是 PowerShell 的一项安全功能,用于控制脚本在计算机上运行的条件。常见的策略有:
Restricted
(默认):不允许任何脚本运行。AllSigned
: 只允许运行经过数字签名验证的脚本。RemoteSigned
: 允许运行本地自己编写的脚本,但从网上下载的脚本必须经过数字签名。Unrestricted
: 允许运行所有脚本,存在安全风险。Bypass
: 不加载任何配置,不进行任何检查,完全绕过执行策略,极不安全。
查看当前执行策略:
powershell
Get-ExecutionPolicy
更改执行策略:
你可以根据需要更改执行策略。通常,对于学习和个人使用,将策略设置为 RemoteSigned
是一个比较平衡的选择。你需要以管理员身份运行 PowerShell 来更改全局策略。
powershell
Set-ExecutionPolicy RemoteSigned
执行此命令后,系统会提示你确认更改。输入 Y
或 A
并回车即可。
重要提示: 将执行策略设置为 Unrestricted
或 Bypass
存在安全风险,请谨慎操作,尤其是在生产环境或不确定脚本来源的情况下。
第八章:实际应用举例
通过几个简单的例子来感受 PowerShell 的强大之处。
8.1 列出前 5 个占用内存最多的进程:
powershell
Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 5 Name, WorkingSet | Format-Table
Get-Process
: 获取所有进程对象。Sort-Object WorkingSet -Descending
: 按WorkingSet
(工作集内存) 属性降序排序。Select-Object -First 5 Name, WorkingSet
: 选择前 5 个对象,并只保留Name
和WorkingSet
属性。Format-Table
: 以表格形式输出结果。
8.2 查找 C 盘大于 1GB 的文件:
powershell
Get-ChildItem C:\ -Recurse -ErrorAction SilentlyContinue | Where-Object {$_.Length -gt 1GB} | Format-Table Name, Length, FullName
Get-ChildItem C:\ -Recurse
: 递归查找 C 盘所有文件和文件夹。-ErrorAction SilentlyContinue
: 忽略查找过程中可能出现的权限错误。Where-Object {$_.Length -gt 1GB}
: 过滤出Length
(文件大小) 大于 1GB 的对象。注意:文件夹没有Length
属性,所以$_.Length
为空,比较时会被忽略,只处理文件。PowerShell 支持单位后缀,如KB
,MB
,GB
,TB
,PB
。Format-Table Name, Length, FullName
: 以表格形式显示文件名、大小和完整路径。
8.3 获取本机所有 IP 地址:
powershell
Get-NetIPAddress | Where-Object {$_.AddressFamily -eq 'IPv4' -and $_.PrefixOrigin -eq 'Dhcp'} | Select-Object IPAddress, InterfaceAlias
Get-NetIPAddress
: 获取所有网络适配器的 IP 地址信息。Where-Object {$_.AddressFamily -eq 'IPv4' -and $_.PrefixOrigin -eq 'Dhcp'}
: 过滤出 IPv4 地址且是通过 DHCP 获取的地址。Select-Object IPAddress, InterfaceAlias
: 只显示 IP 地址和对应的网络接口名称。
第九章:进阶之路
本教程只是带你入了 PowerShell 的门。PowerShell 的功能远不止这些。接下来,你可以继续学习:
- 控制流程:
If/Else
条件判断,For
,ForEach
,While
循环。 - 函数: 编写可重用的代码块。
- 错误处理:
Try/Catch/Finally
。 - 模块 (Modules): PowerShell 的功能可以通过模块进行扩展,许多微软产品和第三方软件都提供了 PowerShell 模块来自动化管理(如 Active Directory 模块, Exchange Online 模块, Azure 模块)。
- 远程处理 (Remoting): 通过 PowerShell 连接到远程计算机执行命令或脚本。
- Desired State Configuration (DSC): 用于配置管理和部署。
- 集成脚本环境 (ISE) 或 VS Code 的高级功能: 调试、片段、格式化等。
- 正则表达式 (Regular Expressions): 结合
-match
等运算符进行更强大的文本匹配。 - WMI 和 CIM: 访问更底层的 Windows 管理信息。
结语:实践出真知
学习 PowerShell 最好的方法就是动手实践。从简单的命令开始,逐步尝试组合 Cmdlet,解决你日常工作中遇到的实际问题。遇到困难时,不要犹豫使用 Get-Help
和搜索引擎。有很多优秀的在线资源、博客、论坛和社区可以提供帮助。
PowerShell 是一个非常值得投入时间学习的技能。它将极大地提高你在 Windows 环境下的工作效率,为你的职业发展开辟新的道路。
现在,打开你的 PowerShell 窗口,开始你的自动化之旅吧!