标题:使用 PowerShell 脚本实现项目文件的备份与压缩

在开发项目的过程中,我们经常需要对项目文件进行备份,以防止意外的数据丢失或方便版本管理。今天,我将为大家介绍一段实用的 PowerShell 脚本,它可以帮助你轻松地完成项目文件的备份和压缩工作,并且可以根据自己的需求添加后缀来区分不同的备份版本。

一、脚本功能概述

这个 PowerShell 脚本主要实现了以下几个功能:

  1. 参数化备份后缀
    通过使用 param 关键字,我们定义了一个名为 $suffix 的参数,其类型为字符串,默认值为空字符串。

    param(
        [string]$suffix = ""
    )

    这样,当你运行脚本时,可以根据需要传入后缀信息,例如:.\backup_script.ps1 -suffix "_v1",使得生成的备份文件更具辨识度。

  2. 创建备份目录
    使用 Get-Date 命令获取当前日期和时间,并将其格式化为 yyyy-MM-dd_HH-mm-ss 的字符串形式存储在 $timestamp 变量中。然后,在当前目录下的 Backup 子目录中创建一个以该时间戳命名的备份目录。

    $timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
    $backupDir = ".\Backup\$timestamp"
    New-Item -ItemType Directory -Force -Path $backupDir

    这里的 New-Item 命令的 -ItemType Directory 参数表明我们要创建一个目录,而 -Force 参数则允许我们在目录已存在的情况下强制创建,避免因目录已存在而报错。

  3. 排除特定目录
    我们定义了一个包含需要排除目录的数组 $excludeDirs,其中包括了常见的开发过程中不需要备份的目录,如 binobj.vsBackup 等。

    $excludeDirs = @(
        "bin",
        "obj",
        ".vs",
        "Backup"
    )

    这些目录通常包含编译产生的临时文件或者其他不需要备份的文件,排除它们可以使备份更加简洁和有效。

  4. 筛选和复制文件
    对于一系列指定的文件扩展名(存储在 $includeExtensions 数组中),使用 Get-ChildItem 命令查找当前目录及其子目录中所有匹配扩展名的文件,并使用 Where-Object 筛选出不在排除目录中的文件。

    $includeExtensions = @(
        "*.cs",
        "*.xaml",
        "*.csproj",
        "*.sln",
        "*.config",
        "*.json",
        "*.md",
        "*.ps1",
        "*.htm",
        "*.html",
        "*.php",
        "*.js",
        "*.css",
        "*.ttf",
        "*.ico",
        "*.png",
        "*.md",
        "*.ini" )
    foreach ($ext in $includeExtensions) {
        Get-ChildItem -Path.\ -Filter $ext -Recurse | 
        Where-Object { 
            $include = $true
            foreach ($excludeDir in $excludeDirs) {
                if ($_.FullName -like "*\$excludeDir\*") {
                    $include = $false
                    break
                }
            }
            $include
        } | 
        ForEach-Object {
            # 文件复制逻辑
        }
    }

    这里的 Get-ChildItem 命令通过 -Path.\ 从当前目录开始查找,-Filter $ext 根据文件扩展名筛选文件,-Recurse 进行递归查找。Where-Object 部分通过遍历 $excludeDirs 来排除文件。

  5. 复制文件到备份目录
    对于筛选出来的文件,将其复制到之前创建的备份目录中。使用 Split-Path -Parent 提取目标路径的父目录,并确保目标目录存在,如果不存在则使用 New-Item 创建。

    ForEach-Object {
        $targetPath = $_.FullName.Replace($PWD.Path, $backupDir)
        $targetDir = Split-Path -Parent $targetPath
        if (!(Test-Path $targetDir)) {
            New-Item -ItemType Directory -Force -Path $targetDir
        }
        Copy-Item $_.FullName -Destination $targetPath -Force
    }

    Copy-Item 命令将文件复制到 $targetPath-Force 表示如果文件已存在则强制覆盖。

  6. 压缩备份文件
    备份文件复制完成后,使用 Compress-Archive 命令将备份目录下的所有文件压缩成一个 ZIP 文件。

    Write-Host "正在创建ZIP文件..." -ForegroundColor Yellow
    Compress-Archive -Path "$backupDir\*" -DestinationPath $zipFile -Force

    这里使用 -Force 参数表示如果 ZIP 文件已存在,则强制覆盖。

  7. 清理临时备份目录
    最后,使用 Remove-Item 命令删除临时创建的备份目录,释放磁盘空间。

    Remove-Item -Path $backupDir -Recurse -Force

    -Recurse 参数确保删除备份目录及其子目录和文件,-Force 确保强制删除。

  8. 输出信息
    在脚本的执行过程中,使用 Write-Host 命令输出相应的信息,使用不同的颜色显示,如黄色显示正在创建 ZIP 文件,绿色显示备份完成及 ZIP 文件的位置。

    Write-Host "备份完成!" -ForegroundColor Green
    Write-Host "ZIP文件位置: $zipFile" -ForegroundColor Green

二、使用方法和注意事项

使用方法

  1. 将上述脚本保存为一个 .ps1 文件,例如 backup_script.ps1
  2. 打开 PowerShell 窗口,将工作目录切换到脚本所在目录。
  3. 如果你要使用默认的 ZIP 文件名,直接运行脚本:
    .\backup_script.ps1
  4. 如果你想添加后缀到 ZIP 文件名,运行脚本时传递后缀参数:
    .\backup_script.ps1 -suffix "_v1"

注意事项

  • 确保在运行脚本前,根据你的系统设置,将 PowerShell 的执行策略设置为允许脚本的执行,可以使用 Set-ExecutionPolicy RemoteSigned 命令。
  • 确保你对脚本涉及的文件和目录具有读写权限,避免因权限问题导致备份失败。
  • 根据自己的项目情况,可以修改 $excludeDirs$includeExtensions 数组,添加或删除需要排除的目录和需要备份的文件扩展名。

通过这个简单而强大的 PowerShell 脚本,我们可以轻松地完成项目文件的备份和压缩工作,并且可以根据不同的需求灵活地添加后缀。无论是个人开发项目还是团队项目,这样的备份机制都能为我们的数据安全和版本管理提供很好的支持,大大提高我们的工作效率和安全性。

完整代码

# 定义脚本的参数,这里使用 param 关键字定义了一个名为 $suffix 的参数,其类型为字符串,默认值为空字符串
# 用户可以在调用此脚本时传入后缀信息,如:.\backup_script.ps1 -suffix "_v1"
param(
    [string]$suffix = ""
)
# 获取当前日期时间作为备份文件夹名,使用 Get-Date 命令获取当前日期和时间,并将其格式化为 "yyyy-MM-dd_HH-mm-ss" 的字符串形式
# 将格式化后的日期时间存储在 $timestamp 变量中
$timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
# 构建备份目录的路径,该目录位于当前目录下的 Backup 子目录中,并使用 $timestamp 作为子目录名
$backupDir = ".\Backup\$timestamp"
# 构建 ZIP 文件名,将后缀添加到末尾
# 最终的 ZIP 文件名会根据用户输入的后缀有所不同,例如 XL_Browser_2025-01-21_10-30-00_v1.zip
$zipFile = ".\Backup\XL_Browser_$timestamp$suffix.zip"
# 创建备份目录
# 使用 New-Item 命令创建一个新的目录,-ItemType Directory 表示创建的是一个目录,-Force 表示如果目录已存在,会强制创建(覆盖)
New-Item -ItemType Directory -Force -Path $backupDir
# 要排除的文件夹,将存储在 $excludeDirs 数组中的文件夹名称将在后续复制文件时被排除
$excludeDirs = @(
    "bin",
    "obj",
    ".vs",
    "Backup"
)
# 要备份的文件扩展名,存储在 $includeExtensions 数组中的文件扩展名使用通配符 * 表示任何文件名只要后缀符合这些扩展名都将被备份
$includeExtensions = @(
    "*.cs",
    "*.xaml",
    "*.csproj",
    "*.sln",
    "*.config",
    "*.json",
    "*.md",
    "*.ps1",
    "*.htm",
    "*.html",
    "*.php",
    "*.js",
    "*.css",
    "*.ttf",
    "*.ico",
    "*.png",
    "*.md",
    "*.ini" )
# 复制文件
foreach ($ext in $includeExtensions) {
    # 使用 Get-ChildItem 命令查找当前目录及其子目录中所有匹配 $ext 的文件
    # -Path.\ 表示从当前目录开始查找,-Filter $ext 表示根据 $ext 中的扩展名筛选文件,-Recurse 表示递归搜索子目录
    Get-ChildItem -Path.\ -Filter $ext -Recurse | 
    # 使用 Where-Object 筛选出不位于排除目录中的文件
    Where-Object { 
        # 首先将 $include 标记为 true
        $include = $true
        # 对于每个文件,会遍历 $excludeDirs 数组
        foreach ($excludeDir in $excludeDirs) {
            # 如果文件的完整路径包含排除目录,则将 $include 标记为 false
            if ($_.FullName -like "*\$excludeDir\*") {
                $include = $false
                break
            }
        }
        # 最终仅保留 $include 为 true 的文件
        $include
    } | 
    # 对于筛选出的每个文件,执行以下操作
    ForEach-Object {
        # 将文件的原始路径替换为备份目录路径,得到目标路径
        $targetPath = $_.FullName.Replace($PWD.Path, $backupDir)
        # 使用 Split-Path -Parent 提取目标路径的父目录
        $targetDir = Split-Path -Parent $targetPath
        # 确保目标目录存在
        if (!(Test-Path $targetDir)) {
            # 如果目标目录不存在,使用 New-Item 创建该目录,-ItemType Directory 表示创建目录,-Force 表示强制创建
            New-Item -ItemType Directory -Force -Path $targetDir
        }
        # 复制文件,将文件复制到目标路径,-Force 表示如果文件已存在,会强制覆盖
        Copy-Item $_.FullName -Destination $targetPath -Force
    }
}
# 创建ZIP文件
# 输出正在创建 ZIP 文件的信息,使用黄色字体显示
Write-Host "正在创建ZIP文件..." -ForegroundColor Yellow
# 使用 Compress-Archive 命令将备份目录下的所有文件压缩成 ZIP 文件
# -Path "$backupDir\*" 表示压缩备份目录下的所有文件,-DestinationPath $zipFile 指定压缩文件的存储路径,-Force 表示如果 ZIP 文件已存在,会强制覆盖
Compress-Archive -Path "$backupDir\*" -DestinationPath $zipFile -Force
# 删除临时备份目录
# 使用 Remove-Item 命令删除备份目录及其子目录和文件
# -Path $backupDir 指定要删除的目录,-Recurse 表示递归删除,-Force 表示强制删除
Remove-Item -Path $backupDir -Recurse -Force
# 输出备份完成的信息,使用绿色字体显示
Write-Host "备份完成!" -ForegroundColor Green
# 输出 ZIP 文件的位置,使用绿色字体显示
Write-Host "ZIP文件位置: $zipFile" -ForegroundColor Green

希望这篇文章对你理解和使用这个脚本有所帮助,让我们一起享受 PowerShell 带来的便利吧 如果你有任何问题或建议,欢迎在评论区留言。