PowerShell 是一种脚本语言和命令行外壳,用于任务自动化和配置管理,主要由系统管理员和高级用户使用。它基于 .NET 框架(PowerShell 7 使用 .Net Core),支持 Windows、Linux 和 macOS。它能够自动化管理任务,例如管理用户帐户、配置网络以及执行备份,从而降低人为错误。
尽管 PowerShell 简化了管理工作,但它也可能带来挑战,尤其是对初学者而言。常见问题包括语法错误、路径配置不当、依赖关系问题以及令人困惑的错误信息。此外,为了增强安全性,默认情况下会限制脚本执行,要求用户调整执行策略以运行脚本。为了在保持安全的同时最大化 PowerShell 的潜力,用户必须将对脚本的谨慎处理与故障排除能力结合起来。
为什么要使用 PowerShell 脚本?
PowerShell 脚本是 Windows 以及跨平台环境中系统管理员和开发人员不可或缺的工具。通过自动化诸如账户管理、网络监控和软件部署等流程,可以节省大量时间,让 IT 专业人员将精力投入到战略性工作、工作流优化和问题解决上,从而提高效率并推动创新。他们甚至可以为脚本安排定时,以实现自动执行。PowerShell Remoting 通过从集中式界面实现对多个系统的安全远程管理,进一步放大了 PowerShell 的价值,减少了对物理访问的需求,并提升对事件的响应速度。
使用 PowerShell 脚本还能确保对复杂操作进行一致且准确的执行。消除人为错误对于在合规与安全要求下维持统一的配置至关重要。这种可靠性在大规模环境中尤为宝贵,因为即使是很小的不一致也可能导致漏洞或运行故障。
理解 PowerShell 执行策略
PowerShell 使用 execution policies 来控制 PowerShell 脚本是否可以在系统上运行;如果可以,则在什么条件下运行。
执行策略设置
执行策略可以包含以下设置:
- 受限:无法运行任何脚本;只能在 PowerShell 提示符中执行单个命令。尝试运行脚本会导致错误消息:“此系统中已禁用脚本运行。” 这是大多数系统的默认设置。
- AllSigned: 只有由受信任的发布者签名的脚本才能运行。该设置能确保只执行已验证的脚本,从而提供较高的安全性。
- RemoteSigned: 在本地创建的脚本可以在没有签名的情况下运行,但从互联网上下载的脚本必须由受信任的发布者签名。该策略通常建议用于日常使用。
- 不受限制: 无论脚本的来源是什么,还是脚本是否已签名,都可以运行所有脚本。不过,当用户执行下载的脚本时,会收到警告,以提醒他们注意相关风险。
更改执行策略的方法Set-ExecutionPolicy
要修改执行策略,请使用 Set-ExecutionPolicy cmdlet。-Scope 参数用于定义作用范围:CurrentUser 仅适用于当前登录的用户,而 LocalMachine 适用于系统上的所有用户(使用此值需要管理员权限)。
下面是一个示例:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
在提示时输入 Y(是)以确认更改。
使用 Get-ExecutionPolicy 检查执行策略
您可以使用以下命令检查当前的执行策略:
Get-ExecutionPolicy -List
下面是示例输出:
运行 PowerShell 脚本的分步指南
要从 PowerShell 运行 PowerShell 脚本,请按以下步骤操作:
步骤 1:启动 PowerShell
在运行脚本之前,你需要打开 PowerShell。以下是两种选择:
- 单击“开始”菜单,输入 PowerShell ,然后选择 Windows PowerShell。
- 在“开始”菜单中输入 cmd ,启动命令提示符。输入 powershell 以打开 PowerShell 会话。
步骤 2:导航到脚本的位置
接下来,通过运行 cd 命令导航到 .ps1 文件所在的目录:
cd C:\Users\AbbeyCrawford\Scripts
步骤 3:运行脚本
运行 PowerShell 脚本的命令取决于你是否位于脚本所在的目录:
- 如果你正在脚本所在的目录中,以下是在 PowerShell 中运行脚本的方法:
.\HelloWorld.ps1
- 如果你不在脚本所在的目录中,要运行 PowerShell 脚本,你必须提供其完整路径:
C:\Users\JohnDoe\Scripts\HelloWorld.ps1
- 如果脚本位于当前目录的子文件夹中,请使用 .\ 作为前缀来提供相对路径:
.\SubFolder\HelloWorld.ps1
- 路径前面的点号(.)表示你希望在当前会话中运行该脚本,以便其变量或函数在执行后仍可保持可用。(点号作用/点号引入将在本文后面更详细地说明。)请注意两个点之间的空格。
. .\HellowWorld.ps1
. C:\Scripts\MyScripts\HelloWorld.ps1
带参数运行脚本
许多 PowerShell 脚本都接受参数,以便更灵活。你在执行脚本时可以传递参数(arguments)。
例如,假设你有下面这个脚本,它接受两个参数:Name 和 Age:
param(
[string]$Name,
[int]$Age
)
Write-Host "Hello, $Name! You are $Age years old."
When running the script, you can pass arguments to it as follows:
.\Get-UserInfo.ps1 -Name "John" -Age 30
如何从 CMD 运行 PowerShell 脚本
要从命令提示符执行 PowerShell 脚本,请按以下步骤操作:
- 在搜索栏中输入 cmd ,然后按下 Enter。
- 使用以下命令运行你的 PowerShell 脚本。-File 选项是必需的;它用于指定要运行的脚本文件。
powershell -File C:\Scripts\Get-UserInfo.ps1
使用 -NoExit 选项
在某些情况下,你可能希望在脚本执行完成后,PowerShell 窗口保持打开。对于调试来说,这尤其有用;当脚本被设计为在窗口关闭前显示你想要查看的输出时,也会很有帮助。
从命令提示符运行脚本时,要保持 PowerShell 窗口打开,请使用下面所示的 -NoExit 选项:
powershell -NoExit -File C:\Scripts\Backup.ps1
如何以管理员身份运行 PowerShell
许多管理任务需要提升权限才能成功执行。例如:安装软件、修改网络设置以及访问系统目录。如果在没有管理员权限的情况下尝试执行这些任务,可能会导致错误,从而阻碍重要的维护或配置任务。
要以管理员权限运行 PowerShell,请右键单击 Windows PowerShell ,然后选择 Run as Administrator。
使用 Start-Process 进行管理员级执行
在某些情况下,你需要在 PowerShell 会话中运行另一个实例的 PowerShell 或脚本。Start-Process cmdlet 是一个完美的工具。添加 -Verb RunAs 参数会指示 PowerShell 以管理员权限启动一个新的实例:
Start-Process PowerShell -Verb RunAs
要以更高权限执行特定脚本,请添加 -ArgumentList 参数,并使用 -File 来指定脚本的路径。下面是两个示例:
Start-Process PowerShell -ArgumentList '-File "C:\Scripts\Update-Software.ps1"' -Verb RunAs
Start-Process powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File “ C:\Scripts\Update-Software.ps1” -Verb RunAs
常见错误及其修复方法
排查错误一开始可能会让人感到望而生畏,但成功解决它们是一个重要的进步,就像因调试技能而获得金、银、铜徽章一样。下面是一些最常见的问题以及如何有效解决它们。
“已禁用脚本运行”错误
此错误发生是因为 PowerShell 的默认执行策略设置为 Restricted,从而阻止任何脚本运行。例如,下面的截图显示了错误:“无法加载文件 C:\Scripts\Get-UserInfo.ps1,因为此系统已禁用脚本运行”:
要解决此问题,请修改执行策略以允许脚本执行。使用 Set-ExecutionPolicy 将其更改为更宽松的设置,例如 RemoteSigned。
语法错误
语法错误通常源于命令结构不正确、缺少参数或拼写错误。下面是一个示例:
要修复语法错误,请仔细阅读显示的错误信息,并查看所提示的行号以确定错误发生的位置。为防止错误,请始终再次核对脚本中是否存在常见失误,并考虑使用提供语法高亮或 IntelliSense 功能的代码编辑器。
权限错误
权限错误发生在脚本尝试访问需要更高权限的资源时,或当文件/文件夹权限不足时。例如,下面的错误表示对路径 C:\Backup\Backup.txt 的访问被拒绝:
以下是解决该问题的两种方法:
- 右键单击 PowerShell,选择 以管理员身份运行,然后再次执行你的脚本。
- 检查脚本正在访问的文件或文件夹的权限,并使用 Get-Acl 和 Set-Acl cmdlet 授予必要的权限。
面向初学者的 Windows PowerShell 脚本教程(PDF)
了解更多在不同环境中运行 PowerShell 脚本
运行 PowerShell 脚本的流程会因你是在哪种情况下运行而有所不同:
- 在 PowerShell 集成脚本环境(ISE)中
- 通过文件资源管理器
- 之类的命令进行远程操作Invoke-Command
在 PowerShell ISE 中运行脚本
PowerShell ISE 是一种用户友好的开发环境,旨在用于编写、测试和调试 PowerShell 脚本。它提供多窗格界面,并具备语法高亮等功能以及内置调试工具。要在 PowerShell ISE 中运行脚本,请执行以下步骤:
- 打开 PowerShell ISE。要找到它,你可以在“开始”菜单中搜索 PowerShell ISE,或在 powershell_ise 中输入 Run 对话框(Windows + R)。下面是得到的界面:
- 使用脚本窗格(顶部窗口)来编写或加载脚本。要创建新的 .ps1 文件,请按 FileèNew。要保存脚本,请单击 File > Save As。
- 要运行整个脚本,请单击 Run Script 按钮(绿色三角形)或按 F5。要运行所选行,请先高亮选中它们,然后按 F8。
从文件资源管理器运行脚本
执行 PowerShell 脚本的另一种便捷方法是直接从文件资源管理器中运行。该方式在你希望在不必打开终端窗口的情况下执行脚本,或需要快速访问时非常有用。
- 导航到包含你的 PowerShell 脚本的文件夹。
- 在 .ps1 脚本文件上右键单击。在上下文菜单中选择 Run with PowerShell。这会在新的 PowerShell 窗口中启动脚本并立即执行。
远程运行脚本
PowerShell 还提供了无需物理访问即可在远程计算机上运行脚本的能力。在企业环境中,当需要在多台服务器上执行任务时,这尤其有用。
先决条件:启用远程执行
在远程执行脚本之前,必须在目标系统上启用 PowerShell Remoting。请运行以下命令:
Enable-PSRemoting -Force
Invoke-Command 的基本语法 Invoke-Command
Invoke-Command 允许你在远程计算机上执行 cmdlet 或脚本。例如,要在名为 UpdateSystem.ps1 的远程计算机上运行 Server01 ,请使用以下 cmdlet:
Invoke-Command -ComputerName Server01 -FilePath C:\Scripts\UpdateSystem.ps1
提供要执行的脚本块(Script Block)
若要直接执行脚本块,请使用以下语法:
Invoke-Command -ComputerName Server01 -ScriptBlock { Get-Process }
在多台计算机上运行命令
要在多台计算机上运行脚本,可以按照下面所示,使用变量指定计算机名称:
$computers = "PC1", "PC2", "PC3"
Invoke-Command -ComputerName $computers -ScriptBlock { Your PowerShell Commands }
或者,你也可以将计算机名称以逗号分隔的列表形式传入:
Invoke-Command -ComputerName Server01, Server02 -ScriptBlock { Restart-Service -Name Spooler }
使用任务计划程序自动化 PowerShell 脚本
Windows 任务计划程序是内置于 Windows 操作系统中的工具,可让用户安排任务在特定日期和时间运行、按预定义的计划运行,或在特定事件触发时运行。
如需了解为 PowerShell 脚本安排计划的好处,并获取详细说明、示例、最佳实践以及故障排除提示,请参阅本文:How to Automate PowerShell Scripts with Task Scheduler。
高级技术
PowerShell 提供高级技术,用于提升脚本的可复用性、模块化,以及在不同脚本之间共享变量和函数。两个关键概念是点源(dot sourcing)和脚本模块(script modules)。
点源(Dot Sourcing)
通常,每个脚本都会在一个新的会话中运行,并且在脚本内声明的任何变量或函数在脚本结束时都会丢失。使用点源(dot sourcing)时,脚本会在当前作用域中执行,因此在该脚本中定义的任何变量、函数或别名都可以在调用它的会话中使用。当你希望在不同脚本之间或同一会话内共享通用函数或变量时,这尤其有用。
语法如下:
. .\ScriptName.ps1
第一个点后面跟一个空格(. )表示给 PowerShell:你正在对脚本进行点源(dot sourcing)。
第二部分(.\ScriptName.ps1)是指向你的脚本的相对路径。
使用脚本模块
PowerShell 中的模块是一种包含 PowerShell 函数、cmdlet、变量等内容的包。模块旨在被导入,并在多个脚本中使用。与点源(dot sourcing)相比,模块提供更好的封装和版本管理,使得组织、维护和共享可复用脚本更容易。
要创建脚本模块,只需将脚本保存为 .psm1 文件扩展名,而不是 .ps1。
创建模块后,可以使用以下方式将该模块的功能在 PowerShell 会话中启用:Import-Module 如下所示:
Import-Module C:\Scripts\Modules\Geometry.psm1
运行 PowerShell 脚本的最佳实践
以下最佳实践对于在运行 PowerShell 脚本时保持安全性至关重要,同时也能提升脚本的可用性与准确性。
安全最佳实践
使用强安全的执行策略设置
使用 PowerShell 的执行策略,仅允许来自受信任且已验证的来源的脚本。将执行策略设置为适合您环境的级别。对大多数组织来说,RemoteSigned提供了良好的平衡:允许运行本地创建的脚本,同时要求下载的脚本必须由受信任的发布者进行签名。
为脚本添加数字签名
PowerShell 会在运行脚本之前检查其数字签名。使用受信任的证书对脚本进行数字签名,有助于防止被篡改。
使用所需的最小权限运行脚本
在可能的情况下,以最小权限运行脚本,以在出现安全漏洞或错误时限制潜在损害。
文档最佳实践
文档完善的脚本更易于维护、调试和理解,适用于当前用户和未来用户。
使用注释
注释对于说明脚本的目的、参数和逻辑非常重要。在 PowerShell 中,注释以 # 符号开头。
如需进行简要说明,请使用行内注释:
$backupDirectory = "D:\Backup" # Set the backup directory
要提供更详细的说明,或暂时禁用代码的部分内容,请使用块注释(<# … #>):
<#
该脚本会备份关键数据。
它会检查可用空间,并验证备份的完整性。
#>
查看帮助
为确保您正确使用 PowerShell 函数,请使用 Get-Help 来查看 cmdlet 的语法和用法。例如,要获取 Get-Process 的帮助,请运行以下命令:
Get-Help Get-Process
错误处理最佳实践
恰当的错误处理对于防止 PowerShell 脚本意外失败至关重要,否则可能导致任务未完成或系统处于不稳定状态。
验证输入
为避免出现意外错误,请确保脚本会对输入进行验证。对于诸如姓名或用户头像之类的用户相关数据,这一点尤其重要。
实现 Try-Catch 代码块
try-catch 块是 PowerShell 中处理错误的主要方法。这使您能够从容地捕获并处理异常。下面是一个示例:
try {
# Attempt to run a command
Copy-Item -Path $source -Destination $destination -Recurse
} catch {
# Handle the error
Write-Host "An error occurred: $_"
# Additional error recovery actions can be performed here
}
使用 Finally 块
在必要时添加 final 块。无论 try 块中是否发生错误,该块都会运行,从而让您清理资源或执行最终处理代码。下面是一个示例:
try {
# Code that may throw an exception
Remove-Item -Path $filePath -ErrorAction Stop
} catch {
Write-Host "Failed to remove the file: $_"
} finally {
Write-Host "Cleanup actions have been performed."
}
结论
PowerShell 是一款极其强大的工具,可用于自动化系统管理任务,以确保准确性并提升效率。通过理解诸如执行策略、点源(dot sourcing)和脚本模块(script modules)等核心概念,并遵循安全性与错误处理方面的最佳实践,您就能充分利用 PowerShell,编写健壮、可复用且安全的脚本,从而改善日常运维。
我们鼓励您从编写并运行自己的脚本开始使用 PowerShell 进行实验。先从简单的自动化任务入手,然后逐步深入学习更高级的脚本编写技术。练习得越多,您在自动化复杂工作流、管理远程系统以及处理更大规模的 IT 运维方面就会越熟练。
Netwrix Directory Manager
常见问题(FAQs)
分享到
了解更多
关于作者
Tyler Reese
产品管理副总裁,CISSP
凭借在软件安全行业超过二十年的经验,Tyler Reese 对当今企业面临的快速演变的身份与安全挑战非常熟悉。目前,他担任 Netwrix Identity and Access Management 组合的产品总监;他的职责包括评估市场趋势、确定 IAM 产品线的发展方向,并最终满足终端用户的需求。他的职业经历从为财富 500 强公司提供 IAM 咨询,到在一家大型直销面向消费者(direct-to-consumer)的公司担任企业架构师,涵盖范围十分广泛。 目前,他持有 CISSP 认证。