来用 PowerShell 自动化文件操作吧!超入门脚本解说
在上一篇文章中,我们学习了 10 个方便的 PowerShell 基本 Cmdlet。相信您已经体会到,每个命令都能返回强大的对象,通过管道连接它们,就能实现复杂的处理。
好了,记住了命令的“单词”之后,下一步终于到了将它们组合成“句子”或“故事”的阶段了,也就是创建 PowerShell 脚本。所谓脚本,简单来说就是“将命令整理好的步骤说明书”。一旦创建好,就能一键(或一个命令)完成繁琐的重复性工作。
本文将选取 Web 创作者们在日常业务中经常遇到的具体场景,如“项目初始化设置”、“清理不必要的文件”、“简单的备份”等,从零开始解说如何通过超入门的脚本来实现自动化。读完本文时,您也应该已经掌握了创造属于自己的“魔法棒”的力量!
脚本执行前的准备:更改执行策略
在创建并执行 PowerShell 脚本(扩展名为 .ps1)之前,有一项准备工作是必须的。出于安全考虑,Windows 在初始状态下限制了脚本的执行。让我们来更改这个限制,以便可以安全地执行本地创建的脚本。
首先,以管理员身份打开 PowerShell,并查看当前的执行策略。
Get-ExecutionPolicy
很可能会显示“Restricted”(受限制)。请使用以下命令进行更改。
Set-ExecutionPolicy RemoteSigned
RemoteSigned 是一个对开发者而言既安全又平衡的设置,意思是“本地创建的脚本可以执行,但从互联网下载的脚本若没有可信发布者的签名则无法执行”。当出现确认消息时,请输入“Y”并按回车键。这个设置只需进行一次即可。
实践案例1:自动生成Web制作项目的初始结构
开始制作新网站时,每次都手动创建 `images`, `css`, `js` 等文件夹和 `index.html` 文件,实在是有点麻烦吧。我们来创建一个名为 `New-Project.ps1` 的脚本,将这个过程自动化吧。
脚本内容
请将以下代码粘贴到文本编辑器中,并以 `New-Project.ps1` 为名保存。
# 将脚本运行时传递的第一个参数用作项目名称
$projectName = $args[0]
# 创建项目名称的目录
New-Item -Path ".\$projectName" -ItemType Directory
# 移动到创建的目录中
Set-Location -Path ".\$projectName"
# 批量创建子目录
New-Item -Path ".\images" -ItemType Directory
New-Item -Path ".\css" -ItemType Directory
New-Item -Path ".\js" -ItemType Directory
# 创建 HTML 和 CSS 的模板文件
New-Item -Path ".\index.html" -ItemType File
New-Item -Path ".\css\style.css" -ItemType File
Write-Host "项目 '$projectName' 已准备就绪!" -ForegroundColor Green
执行脚本
在 PowerShell 中,移动到保存脚本的目录,然后执行以下命令。`./` 表示当前目录。
./New-Project.ps1 "MyNewSite"
确认结果
执行后,我们用 `Get-ChildItem` 来查看一下内容吧。
Get-ChildItem -Path ".\MyNewSite"
您应该能看到,指定名称的文件夹以及其中所需的子文件夹和文件都已在瞬间创建完毕。这样,您就从繁琐的初始设置中解放出来了!
实践案例2:自动清理旧的下载文件
接下来是一个稍微进阶一点的脚本。让我们来构思一个脚本,它可以自动搜索并删除“下载”文件夹中存放超过30天的旧文件。
脚本内容(首先是安全确认模式)
直接删除文件很危险,所以我们先创建一个安全的版本,只在屏幕上显示“如果执行,哪些文件将被删除”。关键在于给 Remove-Item 添加 -WhatIf 开关。
# 想要清理的文件夹路径
$targetFolder = "$HOME\Downloads"
# 删除多少天前的文件
$days = 30
# 计算基准日期
$limitDate = (Get-Date).AddDays(-$days)
Write-Host "正在搜索 [$targetFolder] 中早于 [$limitDate] 的文件..."
# 加上 -WhatIf,进行删除的“模拟”
Get-ChildItem -Path $targetFolder -File -Recurse | Where-Object { $_.LastWriteTime -lt $limitDate } | Remove-Item -WhatIf
执行这个脚本(例如保存为 `Clean-Downloads.ps1`)后,只会显示出将要被删除的文件列表,像是“What if: Performing the operation "Remove File" on target...”,实际上并不会删除任何文件。
脚本完成版(实际删除)
用 -WhatIf 确认了目标文件没有问题之后,终于可以上实际删除的版本了。删掉 -WhatIf,代之以添加 -Verbose,这样在删除时会显示出删除了哪个文件,更加友好。
# (前略)
$limitDate = (Get-Date).AddDays(-$days)
Get-ChildItem -Path $targetFolder -File -Recurse | Where-Object { $_.LastWriteTime -lt $limitDate } | Remove-Item -Force -Verbose
-Force 是一个连只读文件等也能强制删除的选项。这样,定期的文件整理工作只需一个命令就能完成。
实践案例3:将指定文件夹备份为带日期的ZIP文件
最后,是一个对 Web 创作者来说非常重要的自动化备份脚本。它会将指定的文件夹压缩成一个文件名包含执行日期和时间的 ZIP 文件。
# 想要备份的文件夹
$sourceFolder = "C:\path\to\your\project"
# 备份文件的保存位置
$destinationFolder = "D:\backups"
# 获取 yyyyMMdd-HHmm 格式的当前日期和时间
$timestamp = Get-Date -Format "yyyyMMdd-HHmm"
# 决定要保存的ZIP文件名
$zipFileName = "project-backup_$timestamp.zip"
$destinationPath = Join-Path -Path $destinationFolder -ChildPath $zipFileName
# 压缩文件夹进行备份
Compress-Archive -Path $sourceFolder -DestinationPath $destinationPath
Write-Host "备份完成: $destinationPath" -ForegroundColor Green
执行这个脚本,就能轻松地创建一个像 project-backup_20250706-1130.zip 这样易于理解的备份文件了。
总结
这次,我们介绍了 PowerShell 脚本的基本写法,以及在 Web 制作现场非常有用的 3 个具体自动化脚本示例。您觉得怎么样?
- 重复性的项目初始化设置
- 定期的文件清理
- 重要数据的备份
通过将这些手工作业编写成脚本,您就能减少错误、节约时间,从而能更专注于更具创造性的工作。编写脚本的诀窍在于,“将手动执行的步骤,分解成一个个 Cmdlet 并写出来”。请务必尝试挑战一下,为您身边那些“麻烦事”编写一个属于自己的自动化脚本吧。
PowerShell 的世界还很深奥。在下一篇文章中,我们将通过图解的方式,彻底比较许多人容易混淆的 PowerShell 和“古老而美好”(?)的命令提示符之间的区别!