在日常的文件管理与处理中,常常需要对大量文件名或文件内容进行修改,而手动逐个操作既繁琐又容易出错。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..."
}
}
}
处理结果: