我有一组大约3000个文件夹,命名为XYZ-1到XYZ-3000。在这些文件夹里面有一组图片文件和一个描述文字文件。比如说
数量 .jpg
文件在每个文件夹中有所不同,但总是有一个单一的描述文件。每个目录的图片文件都有不同的名称,例如`XYZ-1可能包含Property123,而XYZ-10可能包含Easement789。
我需要在.jpg文件的 "Property123 "部分之后重命名包含文件的文件夹。理想情况下,我会截断尾部的数字和下划线,但即使它们留在上面,也会比XYZ-1的名字更好。
我正在做一个批处理文件来完成这个任务,但我的文件无法运行,我也不知道为什么。
这是我的情况。
for /d %%D in (*) do (
set "_dir=%%D"
set /a "_first=1"
cd "%%D"
for %%F in (*) do (
if %_first%==1 set "_name=%%~nF"
set /a "_first=0"
)
cd ..
ren %_dir% %_name%
)
不幸的是,当我运行它时,命令窗口立即关闭。我试过在最后放一个暂停命令,但这并不能使窗口保持打开。文件夹也没有任何变化。
我试了一下我在命令行中的语法,一切看起来都很正常。所以我不知道问题出在哪里。我可以得到一点帮助吗?
试试这个。
@echo off
setlocal EnableDelayedExpansion
for /d %%D in (*) do (
set "_dir=%%D"
set "_name=%%D"
set /a "_first=1"
cd "%%D"
for %%F in (*) do (
if !_first!==1 set "_name=%%~nF"
set /a "_first=0"
)
cd ..
ren !_dir! !_name!
)
你需要在这里使用 setlocal EnableDelayedExpansion, 并在循环中使用 !而不是 %.
我还添加了设置"_name=%%D",这样如果第二个文件夹不包含文件,它就不会尝试将第二个文件夹改成第一个文件夹的名字。
EDIT:
还考虑到了下划线部分。
@echo off
setlocal EnableDelayedExpansion
for /d %%D in (*) do (
set "_dir=%%D"
set "_name=%%D"
set /a "_first=1"
cd "%%D"
for %%F in (*) do (
if !_first!==1 (
set "_name=%%~nF"
set /a "_first=0"
if NOT "!_name!"=="!_name:_=!" (
set "subfix=!_name:*_=!"
for /f "delims=" %%B in ("!subfix!") do set "_name=!_name:_%%B=!"
)
)
)
cd ..
ren !_dir! !_name!
)