PowerShell批量处理文件名称/内容的修改

发布于:2025-06-21 ⋅ 阅读:(13) ⋅ 点赞:(0)

在日常的文件管理与处理中,常常需要对大量文件名或文件内容进行修改,而手动逐个操作既繁琐又容易出错。PowerShell作为一种强大的脚本语言,为我们提供了高效批量处理文件名及内容修改的解决方案。通过编写简单的PowerShell脚本,可以轻松实现对文件的批量重命名、替换文件中的特定字符串等操作,极大地提高工作效率,减少人工操作的失误,让文件管理变得更加便捷与高效。

PowerShell使用方法

一、以管理员身份打开 PowerShell

按 Win 键打开开始菜单

输入 PowerShell

在搜索结果中 右键单击 Windows PowerShell

选择 "以管理员身份运行"

若弹出 UAC 提示,点击 "是" 确认

二、写好脚本文件

三、运行脚本文件

.\demo.ps1 # 执行当前目录下的脚本

当用该方法运行脚本时经常会出现如下报错:.\rename_files.ps1 : 无法加载文件 D:\all_project\rename_files.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。所在位置 行:1 字符: 1

这个错误是由于 PowerShell 的安全策略禁止运行脚本文件造成的。

📌 错误原因分析

PowerShell 执行策略限制

  • PowerShell 默认设置为 Restricted(限制模式)
  • 此策略会阻止任何脚本文件(.ps1)执行
  • 系统保护机制防止潜在恶意脚本运行

检查当前执行策略,在 PowerShell 中输入:

Get-ExecutionPolicy
  • 若返回 Restricted(默认状态),则需修改策略才能运行脚本

针对该问题,通常可以选择临时绕过策略

PowerShell.exe -ExecutionPolicy Bypass -File "D:\路径\脚本名.ps1"

👉 特点:仅本次生效,不影响系统安全设置,执行命令如下所示:

PowerShell批量处理文件名称替换的脚本

# 定义根目录路径(所有文件操作的基础路径)
$rootPath = "D:\all_project\STM32F10x_StdPeriph_Driver\src"

# 显示脚本启动信息
Write-Host "Started file renaming..."

# 递归获取根目录下所有文件,仅筛选名称包含'f10x'的文件
$files = Get-ChildItem -Path $rootPath -Recurse -File | Where-Object { 
    $_.Name -match 'f10x' 
}

# 遍历筛选后的文件集合
foreach ($file in $files) {
    # 替换文件名
    $newName = $file.Name -replace 'f10x', 'F103'
    
    # 异常处理块
    try {
        # 显示重命名操作详情
        Write-Host "Renaming: $($file.Name) -> $newName"
        
        # 执行实际重命名操作(-Force覆盖同名文件)
        Rename-Item -Path $file.FullName -NewName $newName -Force
        
        # 成功提示(绿色文字)
        Write-Host "Renamed successfully." -ForegroundColor Green
    }
    catch {
        # 错误处理:显示失败原因(红色文字)
        Write-Host "Error renaming $($file.FullName): $_" -ForegroundColor Red
    }
}

# 显示脚本完成信息(青色文字)

处理结果:

PowerShell批量处理文件内容字符替换的脚本

# 设置根目录路径(STM32标准外设驱动源码位置)
$rootPath = "D:\all_project\STM32F10x_StdPeriph_Driver\src"

# 定义需要处理的目标文件扩展名列表(覆盖常见代码/配置文件类型)
$fileExtensions = @("*.c", "*.h", "*.txt", "*.htm", "*.uvprojx", "*.uvoptx", "*.bat", "*.xlsx", "*.*")

# 显示脚本开始执行的提示信息
Write-Host "Starting to replace 'f10x' with 'F103' in file contents..."

# 遍历每种文件扩展名类型
foreach ($extension in $fileExtensions) {
    # 递归获取当前扩展名的所有文件
    $files = Get-ChildItem -Path $rootPath -Filter $extension -Recurse -File
    
    # 记录文件总数用于进度显示
    $fileCount = $files.Count
    $processedCount = 0  # 已处理计数器
    
    # 遍历当前扩展名的所有文件
    foreach ($file in $files) {
        # 读取文件全部内容(-Raw保留换行符格式)
        $content = Get-Content -Path $file.FullName -Raw -ErrorAction SilentlyContinue
        
        # 当文件内容存在且非空时执行替换
        if ($content) {
            # 进行字符串替换(大小写敏感)
            $newContent = $content -replace "f10x", "F103"
            
            # 比较内容是否发生变化(避免不必要的写入)
            if ($newContent -ne $content) {
                try {
                    # 写入修改后的内容(-Force覆盖只读文件)
                    $newContent | Set-Content -Path $file.FullName -Force
                    Write-Host "Updated content in: $($file.FullName)"
                }
                catch {
                    # 文件写入失败时的错误处理
                    Write-Host "Error updating $($file.FullName): $_" -ForegroundColor Red
                }
            }
        }
        
        # 更新进度计数器
        $processedCount++
        # 每处理100个文件显示一次进度
        if ($processedCount % 100 -eq 0) {
            Write-Host "Processed $processedCount of $fileCount files..."
        }
    }
}

处理结果:


网站公告

今日签到

点亮在社区的每一天
去签到