0

这是我的情况。我有几百个文件夹(在 Windows XP 下),每个文件夹都包含几个 .jpg。当我在重命名其中一个文件夹的过程中不小心选择了所有文件夹时,文件夹的名称都搞砸了。

我要做的是编写一个 DOS Batch 脚本,它将遍历每个文件夹,确定目录中最新文件的修改日期并将文件夹重命名为 YYYY-MM-DD 格式的该日期。因此:

Directory of C:\Work_Area\Messed_up_dir_name

07/11/2012  10:01 AM    <DIR>          
07/11/2012  10:01 AM    <DIR>          
03/10/2008  11:00 AM           176,640 image1.jpg
08/07/2007  02:27 PM            25,088 image2.jpg
04/12/2007  04:52 PM           132,608 image3.jpg
02/06/2007  06:11 PM            61,086 image4.jpg

变成"C:\Work_Area\2008-03-10\"

这是我到目前为止写的...

@echo off   
REM ITERATE THROUGH EACH DIRECTORY
FOR /F "DELIMS==" %%d in ('DIR "%ROOT%" /AD /B') DO ( 
    ECHO %%d
    cd %%d
    REM DETERMINE NEWEST FILE
    FOR /F %%a in ('DIR /O:-D /B') DO @ECHO %%~ta
    cd ..     
    REM echo Newest=%Newest%    
    REM move "%%f" "%Newest%"           
    pause   
)

显然,日期中的斜杠需要更改为另一个字符才能成功。如果有人可以帮助我解决这个问题,将不胜感激!

4

1 回答 1

3

此脚本将重命名目录树的文件夹,其根在脚本的第一个参数 (%1) 中指定。我编写了脚本以满足该问题的第二条评论中指定的要求。

编写的脚本实际上会回显将运行的重命名命令。准备好重命名时,只需从 REN 前面删除 ECHO 命令即可。

如果同级文件夹具有具有相同时间戳的最新修改文件,则至少一次重命名将失败。

此外,该脚本无法重命名不包含任何文件的文件夹。

@echo off
setlocal disableDelayedExpansion
if "%~1" neq "" pushd %1
for /f "eol=: delims=" %%D in ('dir /s /b /ad ^| sort /r') do call :renameFolder "%%D"
exit /b

:renameFolder
pushd %1
for /f "eol=: delims=" %%F in ('dir /b /a-d /o-d') do (
  for /f "tokens=1-4* delims=/: " %%A in ("%%~tF") do (
    popd
    echo ren %1 "%%C-%%A-%%B %%D.%%E"
    exit /b
  )
)
于 2012-07-12T15:53:06.730 回答