PowerShell 入门
PowerShell 是什么?
Microsoft PowerShell 将命令行界面的功能与脚本语言的能力结合在一起。与主要依赖文本命令的传统命令行工具不同,PowerShell 构建在 .NET 框架之上,能够处理对象而不是纯文本。这样一来,它非常适合需要自动化常见任务、管理远程机器、在应用程序之间共享数据、以代码管理基础设施等工作的桌面和服务器管理员。事实上,学习哪怕一组基础的 Windows PowerShell 命令以及核心脚本功能,都能帮助你实现显著的自动化效果。
本 PowerShell 教程将面向初学者介绍 PowerShell 脚本编写的基础知识。文章会指导你如何自动化任务、提升效率并简化系统管理,同时确保安全、隐私和合规。
PowerShell 在自动化与配置中的重要性
无论你是在管理数百台服务器、配置云资源,还是处理例行的系统维护,PowerShell 都能让你只用几行代码就执行复杂任务。它在重复性任务(如用户管理)方面也表现出色:因为一个脚本就可以用一致的设置创建几十个账户。这样一来,一致的自动化不仅能为你节省时间,还能确保配置在整个环境中被统一应用。
Cmdlet、脚本以及 PowerShell 环境概览
PowerShell 由三个关键要素构成:
- Cmdlet 是 PowerShell 的构建模块。它们是内置命令,可执行特定操作并返回对象。Cmdlet 还可以组合使用,以完成更复杂的操作。
- 脚本可将多个 cmdlet 组合起来,以完成更复杂的任务。脚本可以保存为带有 .ps1 扩展名的文本文件,并且可以进行计划安排并在远程执行。
- PowerShell 环境 将所有内容连贯地整合在一起,为高效工作提供强大的命令行界面。
设置 PowerShell
在各种平台上安装 PowerShell
PowerShell 可在 Windows、macOS 和 Linux 上使用。安装过程会根据操作系统略有不同。在 Windows 系统上,PowerShell 以 Windows PowerShell 的形式预先安装。不过,你可能需要安装更新的版本。在 macOS 和 Linux 上,可以通过如 Homebrew(macOS)或 apt/yum(Linux)之类的包管理器来安装 PowerShell。
理解执行策略
出于安全原因,PowerShell 默认会限制脚本的运行。你可以通过运行以下 Get-ExecutionPolicy 命令来检查策略的设置。你将获得以下值之一:
- 受限 — 不得运行任何 PowerShell 脚本。这是默认设置。
- 全部签名 — 您可以运行由受信任开发者签名的 PowerShell 脚本。
- 远程签名 — 您可以运行自己的脚本,或运行由受信任开发者签名的脚本。
- 不受限制 — 您可以运行任何想要的脚本。
在下面的示例中,PowerShell 设置为默认状态 Restricted:
要修改执行策略,请使用 Set-ExecutionPolicy cmdlet。选择更宽松的策略时,PowerShell 将要求你确认,以确保你理解潜在的安全影响,如下所示:
安装和管理 PowerShell 模块
模块是由 cmdlet、函数和脚本组成的集合,可将 PowerShell 的能力扩展到你所使用的各类平台和工具。常用的模块包括:
- Active Directory
- Microsoft Exchange Server
- Office 365(Microsoft 365)
- SQL Server
- SharePoint Server
- Internet Information Services
您可以使用 Get-Module -ListAvailable cmdlet 查看系统中所有可用模块,如下所示:
你可以使用 Install-Module cmdlet 直接从 PowerShell Gallery 安装你想要的任何模块。然后,你就可以像使用内置的 PowerShell 命令一样使用该模块中定义的 cmdlet 和函数。
PowerShell 基础
关键概念:Cmdlet、管道和对象
与处理文本的传统 Shell 不同,PowerShell 是基于 .NET 对象工作的。这种面向对象的方法能够让数据处理和分析更复杂、更灵活。例如,当你运行 Get-Process 时,输出并不是文本,而是带有属性和方法的实际进程对象。
管道(|)运算符允许你将一个命令的输出直接传递给另一个命令,从而只用极少的代码创建复杂的工作流
基本语法与命令
PowerShell 命令通常遵循以下结构:
动词-名词 -Parameter1 Value1 -Parameter2 Value2
如果你以前没有使用过 PowerShell,以下是一些入门必备的命令:
- Get-Help — 提供有关 cmdlet 的信息
- Get-Command — 列出可用命令
- Get-Member — 显示对象的属性和方法
使用变量、数组和运算符
一个 variable 是一个带名称的容器,用来保存诸如字符串、数字、数组或对象等值。 PowerShell variables 是弱类型的,这意味着在为变量赋值时不需要声明变量的数据类型;数据类型会根据赋予的值动态确定。PowerShell 中的变量名由 $ 符号以及变量名组成。变量名不区分大小写,因此例如 $MyVariable 和 $myvariable 指的是同一个变量。
例如,下面的代码会创建两个变量,并为每个变量分别赋值:
$myVariable = "Hello, World!"$number = 42Arrays are ordered collections of values, which can be accessed by their index (starting at 0). Here is an example:$fruits = @("apple", "banana", "orange")$fruits[0] # Will output "apple"
运算符 是对值和变量执行操作的符号或关键字。PowerShell 支持多种类型的运算符:
- 算术 — 用于数学计算(+, -, *, /, %)
- 比较 — 用于比较数值(-eq, -ne, -gt, -lt, -ge, -le)
- 逻辑 — 用于组合条件(-and, -or, -not)
创建并运行脚本
如何创建 PowerShell 脚本
一个 脚本 是包含一个或多个 PowerShell 命令的文本文件。创建 PowerShell 脚本很简单,只需要基本的文本编辑工具。请像在交互式控制台中一样输入 PowerShell 命令。
你可以使用 # 符号为脚本添加注释,以进行说明,如下所示:
# 此脚本将显示一条消息,并列出正在运行的进程
Write-Host "Hello, World!"Get-Process
保存、修改并执行脚本的步骤
要使用你的脚本,首先将文件保存为扩展名 .ps1 ,以表明它是一个 PowerShell 脚本。要修改脚本,只需在文本编辑器中打开该文件,进行更改并保存。要执行脚本,请打开 PowerShell,导航到脚本所在的目录,然后运行该脚本。
管理用于脚本安全的执行策略
在允许合法的 PowerShell 操作的同时,保护你的环境免受潜在恶意脚本的影响,需要在安全性与功能性之间取得平衡。以下是一些安全管理建议:
- 使用 Get-ExecutionPolicy -List cmdlet 可查看所有作用域的策略。
- 使用 Set-ExecutionPolicy 来更改策略。
- 策略可以在不同范围(MachinePolicy、UserPolicy、Process、CurrentUser、LocalMachine)中进行设置。请根据您的安全需求,按此处所示选择相应范围:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine
- 使用仍能允许必要操作的最严格策略。
- 定期审查并更新执行策略,以确保其符合当前的安全需求。
互动学习:PowerShell Integrated Scripting Environment (ISE)
PowerShell ISE 是一种交互式界面,可让编写和调试 PowerShell 脚本比标准 PowerShell 控制台更轻松、更具交互性。
PowerShell ISE 的功能
PowerShell ISE 的主要功能包括:
- 多窗格界面 — 具有三个窗格的图形用户界面(GUI):
- 脚本窗格 用于编写和编辑脚本
- 控制台窗格 用于交互式执行命令
- 输出窗格 用于显示命令结果和调试输出
- 语法高亮 — 自动为代码的不同元素着色,从而提升可读性
- IntelliSense — 在你输入时提供自动补全建议,帮助你学习可用的 cmdlet 和参数
- 调试工具 — 让你设置断点、逐行执行代码并检查变量
- 集成帮助 — 使用 F1 键快速访问 cmdlet 文档
下面是一个 ISE 会话的截图:
在 ISE 中编写、编辑和调试脚本
首先,可以从“开始”菜单打开 ISE,或在“运行”对话框中输入 powershell_ise 。使用脚本窗格编写你的 PowerShell 代码。ISE 的 IntelliSense 会在你输入时提示 cmdlet 和语法,从而确保准确性,并帮助你发现新的命令。
要运行或编辑现有脚本,可以使用 File > Open ,或将脚本文件拖放到脚本窗格中。使用诸如搜索和替换(Ctrl+F)之类的功能,可以快速修改大型脚本中的代码。
以下提示可帮助你调试脚本:
- 通过点击代码行旁边的边距来添加断点。脚本运行时,执行会在这些断点处暂停,从而让你检查变量并逐步执行代码。
- 使用 F8 键来测试代码的特定部分。使用 F5 来运行整个脚本。
- 使用 F10(步过)或 F11 (步入)逐行执行代码,了解代码的执行流程。
控制流与错误处理
使用循环:For、While 和 ForEach
在 PowerShell 中使用循环(loops),可以显著减少代码冗余并提升脚本效率。无论你是在处理少量项目还是成千上万的数据点,循环都能以简洁而有效的方式处理 PowerShell 脚本中的重复操作。
有几种循环类型可供选择:
- For 循环 — 当你知道所需迭代的确切次数时使用。它通常用于诸如递增计数器或处理数组之类的任务。
- While 循环 — 只要指定的条件计算结果为 True,就会持续执行。适用于迭代次数取决于动态条件的场景。
- ForEach 循环 — 用于遍历数组或命令输出等集合。
在下面的脚本中,循环将执行 5 次,但它很灵活,因为可以在循环内部更改条件:
$i = 0while ($i -lt 5) { Write-Host "Iteration: $i" $i++}
实现条件语句:If-Else、Else-If
条件语句允许你根据特定条件执行不同的代码块:
- The If-Else 语句在条件为真时执行一个代码块,在条件为假时执行另一个代码块,如下示例所示:
$num = 10if ($num -gt 5) { Write-Host "$num is greater than 5"} else { Write-Host "$num is less than or equal to 5"}
在这种情况下,脚本将输出 “10 is greater than 5”。
- 当出现多个条件的场景时会使用 Else-If 语句,因为它允许你检查其他情况,如下所示:
$num = 10if ($num -gt 10) { Write-Host "$num is greater than 10"} elseif ($num -eq 10) { Write-Host "$num is equal to 10"} else { Write-Host "$num is less than 10"}
在这里,输出将是“10 等于 10”。
用于编写健壮脚本的错误处理技巧
无论你编写脚本有多么仔细,错误都是不可避免的,尤其是在刚开始的时候。好消息是,PowerShell 提供了多种工具,帮助你以更优雅的方式处理错误,并防止脚本突然失败。
首先是 Try-Catch-Finally 代码块,用于处理终止类型的错误。下面的脚本会尝试读取一个不存在的文件,捕获错误,然后执行 finally 代码块:
try { # Code that might throw an error Get-Content -Path "C:\NonExistentFile.txt" -ErrorAction Stop} catch { Write-Host "An error occurred: $_"} finally { Write-Host "This code always runs, regardless of errors"}
$ErrorActionPreference 变量控制 PowerShell 如何响应非终止错误(non-terminating errors)。将该变量设置为 Stop 会把非终止错误转换为终止错误(terminating errors),从而可以被 Try-Catch 块捕获,如下所示:
$ErrorActionPreference = "Stop"Get-ChildItem -Path C:\NonExistentPath
-ErrorVariable 参数可将错误详情存储到自定义变量中,这样就可以在不停止脚本执行的情况下检查错误:
Get-ChildItem -Path C:\NonExistentPath -ErrorVariable MyErrorif ($MyError) { Write-Host "An error occurred: $MyError"}
高级脚本技术
自动化管理任务
随着你对 PowerShell 越来越熟悉,你可以利用它来自动化重复性任务。这不仅能减少这些平凡重复任务所需的时间,还能确保一致性并最大限度降低人为因素的影响。例如,PowerShell 经常用于:
- 自动创建 Active Directory 中的用户和计算机账户
- 管理诸如备份和系统更新之类的计划任务
- 同时管理多台计算机
使用 PowerShell Providers 和驱动器
PowerShell providers 允许你像访问文件系统一样访问不同的数据存储。常见的 providers 包括:
- FileSystem — 访问文件和目录
- Registry — 访问 Windows 注册表
- Certificate — 管理用于加密和安全的证书。
驱动器是对提供程序的逻辑表示。例如,C: 驱动器代表 FileSystem 提供程序,而 HKLM: 和 HKCU: 代表注册表配置单元(hive)。下面是使用 Registry 提供程序的示例:
Set-Location HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersionGet-ItemProperty .\Run
您可以创建自定义的 PowerShell 驱动器以便更轻松地访问:
New-PSDrive -Name HKU -PSProvider Registry -Root HKEY_USERS
使用 Common Information Model (CIM) 和 WMI 查询数据
CIM(Common Information Model)和 WMI(Windows Management Instrumentation)提供了一种标准化方式,用于访问系统信息并执行管理任务。CIM 是对 WMI 的现代替代方案,提供更好的性能以及与远程管理工具的兼容性。你可以使用它们来:
- 查询处理器详细信息和磁盘使用情况等硬件信息
- 监控 CPU 和内存使用量等系统性能指标
- 配置诸如网络适配器和防火墙规则之类的设置
PowerShell 的实际应用
管理文件、文件夹和 ACL
PowerShell 提供了用于处理文件、文件夹及其权限的 cmdlet。下面是一些示例:
# 创建新目录
New-Item -Path "C:\Reports" -ItemType Directory
# 复制具有特定扩展名的文件
Copy-Item -Path "C:\OldReports\*.pdf" -Destination "C:\Reports"
您还可以管理访问控制列表(ACL)。使用 Set-Acl 来修改文件或文件夹权限,而无需打开图形工具。下面的脚本说明如何创建并应用新的 ACL 规则:
# Add a new access rule $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("DOMAIN\UserGroup","ReadAndExecute","Allow") $acl.SetAccessRule($rule)# Apply the new ACL Set-Acl -Path "C:\ConfidentialReports" -AclObject $acl
监控系统日志与事件管理
PowerShell 可以查询和分析日志,帮助您识别问题、维持性能并确保安全。Get-EventLog cmdlet 允许您从本地或远程系统检索日志,用于故障排除或审计目的。您还可以创建脚本,用于查找特定的错误代码或警告,并提醒管理员,以便他们能快速响应问题。
自动化 Active Directory 任务
PowerShell 与 Active Directory 集成,可让您执行各种与 AD 相关的任务,包括:
- 批量创建用户账号(New-ADUser)
- 管理组成员(Add-ADGroupMember, Remove-ADGroupMember)
- 重置用户密码(Set-ADAccountPassword)
- 启用或禁用账号(Enable-ADAccount, Disable-ADAccount)
- 查询 AD 以获取信息,例如已锁定的账号或没有密码到期时间的账号(Get-ADUser)
PowerShell 认证与培训
可用的 PowerShell 课程与认证
尽管 Microsoft 不提供官方 PowerShell 认证,但 PowerShell 已纳入多个面向系统管理与云管理的认证项目的课程体系。
Microsoft 确实提供免费且具交互性的教程,涵盖 PowerShell 命令、工作流以及与 Microsoft 服务的集成。你还可以在 Udemy 等网站上找到在线 PowerShell 课程,以及可下载的文档。随着你不断阅读与练习,你会发现自己的熟练度在稳步提升。
IT 专业人员获得认证的好处
认证项目可帮助专业人士打造更有针对性的技能组合,并随时了解最新技术。获得认证表明你深入理解 PowerShell,并能够在真实场景中有效应用它。获得认证的专业人士可能拥有更好的就业前景,职业发展更快,也可能赚取更多收入。
高阶培训选项概览
在高阶 PowerShell 培训中,你可以选择的方向有很多。例如,有些面向 DevOps 的课程会教授如何使用 PowerShell 来自动化 CI/CD 管道。还有一些高阶安全课程则涵盖 系统加固、漏洞检测以及自动化的合规性检查。
面向 IT 专业人士的 PowerShell
使用 PowerShell 进行系统管理
PowerShell 旨在管理并自动化多种管理工作负载,包括:
- Active Directory 管理
- 系统健康监控
- 磁盘管理
- 补丁管理
- 新电脑配置
下面是一些简短示例,说明如何使用 PowerShell 来进行服务管理:
# Get all running servicesGet-Service | Where-Object {$_.Status -eq "Running"}# Restart a specific serviceRestart-Service -Name "Spooler"
跨平台能力:Azure、AWS 和 VMware
不要把 PowerShell 仅仅当作 Windows 管理工具;它是支持云平台和虚拟化技术的跨平台工具。例如:
- AWS Tools for PowerShell 模块使管理员能够从 PowerShell 直接与 EC2 实例和 S3 存储等 AWS 服务进行交互。
- VMware PowerCLI 可以自动化虚拟机配置、vSphere 配置以及数据存储库管理等任务。
面向 Windows 服务器和客户端的任务自动化
PowerShell 可帮助你在 Windows 服务器和客户端计算机上执行批量操作,并自动化重复性任务。示例包括:
- 文件管理,例如在各系统之间批量复制、移动或重命名文件和文件夹
- 对关键系统进行定期备份
- 使用预定义的配置和软件安装快速搭建新服务器或工作站
下面是一个使用 PowerShell 通过 MSI 文件安装软件的示例:
# Install software silently using MSIStart-Process msiexec.exe -ArgumentList "/i C:\path\to\installer.msi /qn" -Wait
PowerShell 中的故障排除与调试
常见脚本问题及解决方案
在学习如何使用 PowerShell 时,您必然会遇到脚本问题。常见的脚本问题包括以下内容:
- 语法错误 通常在出现拼写错误或错误使用括号、大括号或引号时发生。使用内置的错误消息,帮助识别并解决这些问题。
- 变量使用不正确(例如以不一致的作用域声明变量或覆盖变量)可能导致非预期的结果。在脚本执行期间使用 Write-Host 或 Write-Debug 来显示变量值,有助于准确定位这些错误。
- 依赖尚未安装的模块或 cmdlet 会导致脚本失败。使用 Import-Module 确保你拥有脚本所需的一切。
使用调试工具和断点
以下是一些很棒的提示,可帮助你调试脚本:
- 将鼠标悬停在变量上以查看其当前值,从而检查变量。
- 使用 F10 键来执行当前行并移动到下一行。这有助于你定位问题出在哪里。
- 使用 Set-PSBreakpoint cmdlet 可在特定行、函数或变量处暂停执行。这样你就可以在满足某个条件时调查脚本的状态。
- 在脚本中添加 Write-Debug 语句,可以在运行时提供有关变量状态和执行路径的见解。
优化脚本性能的提示
当你的脚本按预期运行之后,值得寻找方法来提升其效率。以下是一些不错的建议:
- 减少冗余代码 避免不必要的循环和冗余命令,因为它们可能会降低执行速度。
- 使用 PowerShell 内置的 cmdlet 尽可能不要使用自定义函数,因为内置 cmdlet 已针对性能进行了优化。
- 使用管道(pipeline)在 cmdlet 之间传递对象 依赖临时变量和中间步骤,而是直接在 cmdlet 之间传递。
下一步与进阶主题
随着你对 PowerShell 越来越熟练,你会希望通过整合用于诸如 Active Directory 管理或 VMware 自动化等任务的模块来增强脚本能力。你可以探索用于复杂任务的高级 cmdlet,例如用于远程管理的 Invoke-Command 或 Start-Job(用于后台任务)。
你还会想要学习如何利用 functions 来创建可复用的代码块。函数可以通过将大型脚本拆分为可管理的部分来简化它们。下面的示例展示了创建一个基本函数:
function Get-Greeting { param($name) Write-Output "Hello, $name!"}
结论
现在你应该已经知道,使用 PowerShell 脚本语言可以实现哪些可能性。尽管在这篇博客中我们只涉及了一些常见术语和 PowerShell 基础知识,但关于这个强大的工具还有更多内容值得学习。PowerShell 一开始可能看起来非常偏技术,但就像任何语言一样,随着你越来越多地把 PowerShell 用于日常任务,它的 cmdlet 很快就会变得对你来说如同本能一般。凭借现有的丰富资源,你可以把自己的 PowerShell 技能提升到你想达到的程度。
申请 Netwrix PolicyPak 免费试用
常见问题(FAQ)
什么是 PowerShell 脚本?
PowerShell 脚本是一种纯文本文件,包含一个或多个 PowerShell 命令,并且具有 .ps1 文件扩展名。脚本让您可以将命令保存以供稍后使用,并与他人共享。它们可以从简单的单条命令到具备高级功能的复杂程序不等。借助 PowerShell 脚本,您可以自动化各种任务,例如系统管理和帐户配置。
如何编写 PowerShell 脚本?
您可以使用简单的文本编辑器编写 PowerShell 脚本。脚本中的每一行都是精确的指令:可以定义变量来存储信息,并使用名为 cmdlets 的内置 PowerShell 命令与系统进行交互。脚本还可以做出判断,例如检查某个服务是否正在运行,或对进程进行筛选。编写完成后,请将脚本保存为 .ps1 文件扩展名,以便日后使用。
PowerShell 脚本编写是否容易?
尽管精通 PowerShell 需要理解编程概念,但其易上手的语法和丰富的内置命令使其成为较容易学习的脚本语言之一。如果你愿意学习,并且对语法细节保持耐心,就不会在提升技能方面遇到问题。随着你阅读和练习的增多,你会发现自己的熟练度会稳步提升。
如何运行 PowerShell 脚本?
以下是运行 PowerShell 脚本的一些方法:
- 以管理员身份启动 Windows PowerShell。导航到脚本所在目录,然后输入 .\scriptname.ps1
- 在文件资源管理器中右键单击该脚本,然后选择 使用 PowerShell 运行。
- 使用 Invoke-Expression cmdlet。
分享到
了解更多
关于作者
Ben Warren
技术产品经理
Ben 是 Netwrix Privilege Secure 的技术产品经理。他通过 Stealthbits Technologies 加入 Netwrix,在那里担任工程师,参与了 StealthAUDIT(现为 Netwrix Enterprise Auditor)。Ben 拥有路易斯安那州立大学的数学硕士学位。