我的某个目录里下(当前目录)有很多文件,有些文件名太长了
由于没学过batch ,来当伸手党了,顺便学习,谢谢!
求一个脚本,在当前目录执行,将目录下所有文件名长度超过20的,取前15位重命名。
如果某个文件前15位仍有重复,则按照每个文件 _1,_2,_3依次排列
比如a_1,a_2,b_1,b_2这样。
研究了半天,嵌套循环写不明白……,外层用for遍历每个文件。
内层循环我想要使用while,结果被告知必须用goto ,可是每当我用goto ,又会跳出外层循环,麻烦提供一个脚本,感谢!
@echo off
setlocal enabledelayedexpansion
cd /d "%~dp0"
for %%i in (*) do (
set "name=%%~ni"
set "ext=%%~xi"
if "!name:~20!" neq "" (
set "newname=!name:~0,15!"
set "num=1"
if not exist "!newname!!ext!" (
ren "%%i" "!newname!!ext!"
) else (
call :check_name
ren "%%i" "!newname!_!num!!ext!"
)
)
)
pause&exit
:check_name
if exist "!newname!_!num!!ext!" (
set /a "num+=1"
call :check_name
)
goto :eof
可以使用以下的批处理脚本实现:
@echo off
setlocal enabledelayedexpansion
for %%f in (*) do (
set "name=%%~nf"
if "!name:~20!" neq "" (
set "newname=!name:~0,15!"
set "num=1"
:check_name
if exist "!newname!_!num!%%~xf" (
set /a "num+=1"
goto :check_name
)
ren "%%f" "!newname!_!num!%%~xf"
)
)
脚本中首先使用for循环遍历当前目录下的每个文件。然后使用set命令将文件名保存在一个变量name中。如果文件名长度大于20,则使用set命令将前15位保存在另一个变量newname中,并设置一个变量num用于记录文件名后面的编号。
接下来使用if exist语句和一个带标签的循环来检查新的文件名是否已经存在,如果存在,则将编号加1,继续检查,直到找到一个未被占用的编号。最后,使用ren命令将原文件重命名为新的文件名。
如果对您有帮助,请给与采纳,谢谢。
@echo off
setlocal enabledelayedexpansion
for %%a in (*.*) do (
set filename=%%~na
set suffix=%%~xa
set length=!filename:~0,15!
set i=1
:loop
if exist !length!!suffix! (
set /a i+=1
set length=!filename:~0,15!_!i!
) else (
ren "%%a" "!length!!suffix!"
)
)
以上代码可以实现指定目录下,将文件名长度超过20的,取前15位重命名,如果某个文件前15位仍有重复,则按照每个文件_1,2,3依次排列的效果。
具体运行步骤如下:
@echo off
setlocal enabledelayedexpansion
set "cnt=0"
for %%f in (*) do (
set "name=%%~nf"
set "ext=%%~xf"
set "fullname=%%~nxf"
set "newname=!name:~0,15!!ext!"
if not "!fullname!"=="!newname!" (
set "i=1"
:loop
if exist "!newname!_!i!!ext!" (
set /a i+=1
goto loop
)
set "newname=!newname!_!i!"
)
if not "%%~nxf"=="!newname!" (
ren "%%~nxf" "!newname!"
echo "%%~nxf" renamed to "!newname!"
set /a cnt+=1
)
)
echo Renamed %cnt% files.
pause
说明:
代码中使用了延迟环境变量扩展(enabledelayedexpansion),以便可以在循环中使用变量;
外层循环遍历当前目录下的所有文件,使用 set 命令设置一些变量;
内层循环用 :loop 和 goto 实现了一个简单的计数器,以便在出现命名冲突时自动增加 _1, _2, _3 等后缀;
使用 if 判断当前文件名长度是否大于 20,如果是则只保留前 15 个字符;
如果新文件名与旧文件名相同,则不进行重命名;
使用 ren 命令进行重命名,同时输出日志;
在最后输出重命名的文件数,并加上暂停,以便查看输出。
请注意:
在运行脚本之前,建议在另一个目录下创建一些测试文件,并尝试运行脚本,确保没有错误发生。
建议备份目标目录,以防脚本产生意外结果。
由于重命名操作不可逆,请慎重使用脚本。
该回答引用ChatGPT
这个脚本首先使用 setlocal enabledelayedexpansion 命令启用延迟环境变量扩展,这样在脚本中使用 ! 符号来引用变量时,变量的值会在运行时进行替换。
然后使用 for 命令遍历当前目录下的所有文件,对于每个文件,检查其文件名长度是否超过20个字符。如果是,则将文件名截取前15个字符作为新文件名,并检查是否有其他文件使用了相同的名称。如果有,则在新文件名末尾添加 _1、_2、_3 等后缀,以避免重名。
最后使用 ren 命令对文件进行重命名,并使用 echo 命令输出重命名的过程和结果,以便进行检查。
_请注意,在实际使用时,请将脚本保存为批处理文件(例如 rename_files.bat),然后在需要重命名的目录下双击运行即可。同时,强烈建议在运行脚本前,先备份需要重命名的文件,以避免出现意外情况。_
@echo off
setlocal enabledelayedexpansion
set "count=1"
for %%f in (*) do (
set "filename=%%~nf"
set "ext=%%~xf"
if "!filename!" neq "!filename:~0,15!" (
set "newname=!filename:~0,15!"
if exist "!newname!!ext!" (
set "newname=!newname!_!count!"
set /a "count+=1"
)
echo Renaming "%%~nxf" to "!newname!!ext!"
ren "%%~nxf" "!newname!!ext!"
)
)