Win系统批量对文件进行重命名的脚本

编辑于:2024年07月29日

Win系统批量对文件进行重命名的脚本

这个脚本的主要目的是遍历指定目录(D:\电子课本教科书)及其子目录下的所有文件,找到所有扩展名为.pdf的文件,并根据文件名中的年级信息对这些文件进行重命名。

脚本

# 设置根目录路径  
$rootDirectory = "D:\电子课本教科书"  
  
# 确保路径存在  
if (!(Test-Path -Path $rootDirectory)) {  
    Write-Host "指定的路径不存在:$rootDirectory" -ForegroundColor Red  
    exit 1  
}  
  
# 遍历指定目录中的所有文件  
Get-ChildItem -Path $rootDirectory -File -Recurse | Where-Object { $_.Extension -eq ".pdf" } | ForEach-Object {  
    # 提取文件名(不含扩展名)  
    $fileName = [System.IO.Path]::GetFileNameWithoutExtension($_.Name)  
  
    # 删除文件名中的 "普通高中教科书·" 部分(如果存在)  
    $fileName = $fileName -replace "普通高中教科书·", ""  
  
    # 定义一个字典来将中文年级转换为数字  
    $gradeMap = @{  
        "一" = "1"; "二" = "2"; "三" = "3"; "四" = "4"; "五" = "5";  
        "六" = "6"; "七" = "7"; "八" = "8"; "九" = "9"; "十" = "10"  
    }  
  
    # 检查文件名中是否包含年级信息  
    if ($fileName -match "(一|二|三|四|五|六|七|八|九|十)年级(上册|下册|全册|全一册)") {  
        # 捕获匹配到的年级(并转换为数字)和册次  
        $gradeNum = $gradeMap[$matches[1]]  
        $edition = $matches[2]
        $nianji ="年级"
        $cccitu ="_玩机大学"

        # 构建新的文件名(包含已转换的年级和删除的前缀)  
        $newFileName = "$gradeNum$nianji$edition.pdf"  
  
        # 获取当前文件的完整路径  
        $oldFilePath = $_.FullName  
  
        # 构建新文件的完整路径(保持目录结构不变)  
        $newFilePath = [System.IO.Path]::Combine([System.IO.Path]::GetDirectoryName($oldFilePath), $newFileName)  
  
        # 如果新文件名与旧文件名不同,则进行重命名  
        if ($oldFilePath -ne $newFilePath) {  
            Write-Host "Renaming '$oldFilePath' to '$newFilePath'" -ForegroundColor Cyan  
            Rename-Item -Path $oldFilePath -NewName $newFilePath  
        }  
    } else {  
        # 如果文件名不包含年级信息,但已删除 "普通高中教科书·"(如果存在),则检查是否需要仅基于此更改重命名  
        # 注意:这里假设如果仅删除了前缀但文件名没有年级信息,则不进一步操作  
        # 如果需要,可以添加逻辑来基于仅删除前缀来重命名文件  
  
        # 仅为了日志记录,输出未转换年级但已删除前缀的文件名(可选)  
        Write-Host "Deleted prefix but no grade found in '$fileName' of file '$($_.FullName)'" -ForegroundColor Yellow  
    }  
}

解读

设置根目录路径:

  • $rootDirectory = "D:\电子课本教科书":设置要遍历的根目录路径。

确保路径存在:

  • ⭕使用Test-Path检查指定的路径是否存在。
  • ⭕如果路径不存在,则输出错误信息并以红色字体显示,然后退出脚本。

遍历指定目录中的所有文件:

  • ⭕使用Get-ChildItem遍历指定目录及其子目录下的所有文件。
  • ⭕使用Where-Object筛选出扩展名为.pdf的文件。

处理每个PDF文件:

  • ⭕对于每个找到的 PDF 文件,提取文件名(不含扩展名)。
  • ⭕删除文件名中的“普通高中教科书·”部分(如果存在)。
  • ⭕定义一个字典$gradeMap,用于将中文年级转换为数字。

检查文件名中是否包含年级信息:

  • ⭕使用正则表达式检查文件名中是否包含年级和册次信息。
  • ⭕如果包含,捕获年级和册次信息,并根据字典将年级转换为数字。
  • ⭕构建新的文件名,格式为年级数字+年级+册次.pdf

重命名文件:

  • ⭕如果新文件名与旧文件名不同,则使用Rename-Item进行重命名,并输出重命名信息。

处理不包含年级信息的文件名:

  • ⭕如果文件名不包含年级信息,但已删除“普通高中教科书·”(如果存在),则输出日志信息,但不进行重命名。

相关推荐

暂无评论