最终最终最终不修改版:一口气解决windows中文件名重命名问题(右键发送到) - NOTEBOOK
最终最终最终不修改版:一口气解决windows中文件名重命名问题(右键发送到)
系统脚本/命令发布于 2026-09-04
摘要 : 使用CMD命令(保存为bat文件),批量对文件名操作:
替换文件名中的字符、添加文件名前缀、添加文件名后缀(非文件类型的后缀)、重命名+序号。
解决了文件名中包含 & 字符的错误、支持中文。
将以下代码存成 编码为
ANSI 的 bat 文件(文件名可设置为:图片-等比缩小 )
存放路径为 :
C:\Users\用户名\AppData\Roaming\Microsoft\Windows\SendTo
❱ 替换字符
@echo off
setlocal DisableDelayedExpansion
if "%~1"=="" exit /b 1
:: 安全读取替换文本(关闭延迟扩展接收特殊字符 & ! ^ )
set "oldstr="
set "newstr="
set /p "oldstr=请输入被替换字符:"
set /p "newstr=请输入新字符:"
if not defined oldstr (
echo 原字符串不能为空!
pause
exit /b
)
echo 开始处理文件...
for %%i in (%*) do (
echo 正在处理: "%%~nxi"
call :SafeReplace "%%~nxi" "%%~dpi"
)
echo.
echo 操作结束
pause
endlocal
exit /b
:: ========== 安全替换子函数 ==========
:SafeReplace
set "fullpath=%~2%~1"
set "filename=%~1"
setlocal EnableDelayedExpansion
set "nameNoExt=!filename!"
:: 使用powershell做安全字符串替换(完美兼容 & ^ % ! < > | 所有特殊符号)
for /f "delims=" %%r in ('powershell -Command "$str='!nameNoExt!';$old='%oldstr%';$new='%newstr%';$str.Replace($old,$new)"') do set "newname=%%r"
if "!newname!"=="" (
echo 错误: 替换后的文件名为空,跳过 "!filename!"
endlocal
goto :eof
)
:: 判断名字有没有变化,避免重复执行ren
if "!newname!"=="!filename!" (
echo 无需修改:!filename!
endlocal
goto :eof
)
ren "!fullpath!" "!newname!" 2>nul || (
echo 错误: 无法重命名 "!filename!"
)
endlocal
goto :eof
❱ 添加前缀.
@echo off
setlocal DisableDelayedExpansion
if "%~1"=="" exit /b 1
:: 安全读取前缀文本(关闭延迟扩展接收特殊字符 & ! ^ )
set "prefix="
set /p "prefix=请输入文件名前缀:"
if not defined prefix (
echo 前缀不能为空!
pause
exit /b
)
echo 开始处理文件...
for %%i in (%*) do (
echo 正在处理: "%%~nxi"
call :SafePrefix "%%~nxi" "%%~dpi"
)
echo.
echo 操作结束
pause
endlocal
exit /b
:: ========== 安全添加前缀子函数 ==========
:SafePrefix
set "fullpath=%~2%~1"
set "filename=%~1"
setlocal EnableDelayedExpansion
:: 拼接前缀 + 原始文件名
set "newname=!prefix!!filename!"
if "!newname!"=="" (
echo 错误: 处理后的文件名为空,跳过 "!filename!"
endlocal
goto :eof
)
:: 判断名字有没有变化,避免重复执行ren
if "!newname!"=="!filename!" (
echo 无需修改:!filename!
endlocal
goto :eof
)
:: call二次解析保护带 & 的文件名
call ren "!fullpath!" "!newname!" 2>nul || (
echo 错误: 无法重命名 "!filename!"
)
endlocal
goto :eof
❱ 添加后缀
@echo off
setlocal DisableDelayedExpansion
if "%~1"=="" exit /b 1
:: 安全读取尾部追加文本(关闭延迟扩展接收特殊字符 & ! ^ )
set "suffix="
set /p "suffix=请输入要追加在文件名后面的字符:"
if not defined suffix (
echo 追加内容不能为空!
pause
exit /b
)
echo 开始处理文件...
for %%i in (%*) do (
echo 正在处理: "%%~nxi"
call :SafeAppend "%%~nxi" "%%~dpi"
)
echo.
echo 操作结束
pause
endlocal
exit /b
:: ========== 安全追加后缀(不改动扩展名)子函数 ==========
:SafeAppend
set "fullpath=%~2%~1"
set "filename=%~1"
set "nameNoExt=%~n1"
set "ext=%~x1"
setlocal EnableDelayedExpansion
:: 拼接:主文件名 + 用户追加字符 + 原始扩展名
set "newname=!nameNoExt!!suffix!!ext!"
if "!newname!"=="" (
echo 错误: 处理后的文件名为空,跳过 "!filename!"
endlocal
goto :eof
)
:: 判断名字有没有变化,避免重复执行ren
if "!newname!"=="!filename!" (
echo 无需修改:!filename!
endlocal
goto :eof
)
:: call二次解析保护带 & 的文件名
call ren "!fullpath!" "!newname!" 2>nul || (
echo 错误: 无法重命名 "!filename!"
)
endlocal
goto :eof
❱ 重命名并带序号
@echo off
rem 打开系统延时
setlocal EnableDelayedExpansion
if "%~1"=="" exit
set /p userinput=请输入文件名前缀:
rem 切换到文件目录下,方便后续重命名操作
cd %~dp1
rem echo %~dp1
set num = 0
for %%i in (%*) do (
set /a num +=1
rem 序号前面补零
set fn=0000!num!
rem fn:~-4 代表截取4位数字
echo !userinput!_!fn:~-4!%%~xi
rem echo %userinput%_!fn:~-4!%%~xi
rem echo %%~nxi
rem 重命名
ren "%%~nxi" "!userinput!_!fn:~-4!%%~xi"
)
echo 操作结束
pause