powershell批量修改文件扩展名的核心是get-childitem筛选目标文件、rename-item重命名,需用-whatif预演、正则安全替换(如\.txt$)、避免覆盖,并通过$_.basename + ".newext"精准仅改扩展名。
在 windows 中用 powershell 批量修改文件扩展名,核心是用 get-childitem 找到目标文件,再用 rename-item 重命名。关键在于准确筛选、安全预演、避免覆盖和处理路径空格等细节。
明确目标范围,精准筛选文件
别直接全盘操作,先用 -Filter 或 -Include 限定类型,配合 -Path 指定目录。例如,只改当前目录下所有 .txt 为 .log:
-
Get-ChildItem -Path "C:\data" -Filter "*.txt"—— 最快,但只支持简单通配符 -
Get-ChildItem -Path "C:\data" -Include "*.txt", "*.bak" -File—— 支持多个模式,-File排除文件夹 - 如需递归子目录,加
-Recurse;想排除某些文件夹,用-Exclude "temp","old"
安全重命名:先测试,再执行
永远先用 -WhatIf 预览实际会做什么,确认无误再删掉它运行:
- 预览命令:
Get-ChildItem *.txt | Rename-Item -NewName { $_.Name -replace '\.txt$', '.log' } -WhatIf - 真正执行时去掉
-WhatIf,并建议加上-ErrorAction SilentlyContinue忽略权限不足等非致命错误 - 注意:
-replace是正则替换,'\.txt$'中的\.转义点号,$表示结尾,防止误改mytext.txt.bak
处理常见陷阱
真实场景中容易出错的地方:
-
文件名含空格或特殊字符:PowerShell 默认能正确处理,但避免用字符串拼接路径(如
"$($_.Directory)\$($_.BaseName).log"),优先用$_.DirectoryName和$_.BaseName属性 -
同名文件已存在:默认会报错。如需自动跳过,加
-ErrorAction SilentlyContinue;如需覆盖,加-Force(慎用) -
只想改扩展名,不碰文件名:用
$_.BaseName + ".newext",别用$_.Name -replace ...,否则可能误改含点的文件名(如ver.2.txt)
完整可运行脚本示例
保存为 rename-ext.ps1,右键“以管理员身份运行”或在 PowerShell 中执行:
# 修改前请务必备份!
$targetDir = "C:\myfiles"
$oldExt = ".old"
$newExt = ".new"
<p>Get-ChildItem -Path $targetDir -Filter "*$oldExt" -File -Recurse |
ForEach-Object {
$newName = $<em>.FullName -replace [regex]::Escape($oldExt) + '$', $newExt
Rename-Item -Path $</em>.FullName -NewName $newName -ErrorAction SilentlyContinue
}
</p>
说明:[regex]::Escape($oldExt) 自动转义扩展名中的特殊字符(如 .log 中的点),确保替换准确。











