目录中的第二个最新文件夹

时间:2016-06-23 08:52:41

标签: windows batch-file

我想要一个批处理文件,它会找出哪个是目录中创建/修改的第二个最新文件夹。 我找到了这篇文章,但无论我多么努力,我都无法理解它是如何工作的

@echo off

set "root_dir=c:\somewhere"
pushd "%root_dir%"
set "bl1="
set "bl2="
setlocal enableDelayedExpansion
for /f "tokens=* delims=" %%# in ('dir /b /a:-d /o:d') do (
set "bl2=!bl1!"
set "bl1=%%#"
)
echo %bl2%
endlocal

如果我按原样使用它,那么我可以获得第二个最新的文件夹,但是这个脚本应该可以获得你需要的最新文件夹,无论是第一个还是第n个。 有人可以告诉我需要对脚本进行哪些修改才能完成。这个脚本究竟是如何工作的

1 个答案:

答案 0 :(得分:0)

在您的方法中,最新文件夹已在变量bl1中可用;在%bl1%之前的末尾添加echo endlocal以显示它。使用该脚本无法灵活地检索 n 文件夹,因为您需要定义另一个变量(例如bl3bl4,...,{循环中的{1}} bl )。

但是,您可以通过更改n选项来反转dir命令输出的排序顺序,以便首先返回最新(最新)项。然后让索引号计算循环的迭代次数,如果该索引等于预定义的数字 n ,则存储当前迭代的项目:

/O

更新

这是一个经过修改的脚本,具有以下改进:

  • 由于切换延迟展开,文件夹名称中的感叹号@echo off setlocal EnableDelayedExpansion rem // Define N here to get Nth-latest folder: set /A LATEST=2 set /A INDEX=0 for /F "eol=| delims=" %%# in ('dir /B /A:D /O:-D "C:\somewhere"') do ( set /A INDEX+=1 if !INDEX! EQU !LATEST! ( set "ITEM=%%#" ) ) if defined ITEM echo %LATEST%th-latest folder: %ITEM% endlocal exit /B 不再丢失;
  • 目标目录可以作为第一个命令行参数提供;如果省略,则使用当前目录;
  • 数字 n 可以作为第二个命令行参数给出;如果省略,系统会提示用户输入(此地址为elzooilogico' s comment);对于空输入, n 默认为!;
  • 改进了显示输出,以避免像11th-latest2th-latest这样奇怪的事情;相反,分别返回3th-latestThe latest2nd-latest;

所以这就是代码:

3rd-latest

要获得与此答案之上的简单脚本类似的结果,您需要通过以下命令行调用此脚本,假设它已保存为@echo off setlocal EnableExtensions DisableDelayedExpansion rem /* define location path and folder pattern as 1st command line argument; rem /* Define number N as 2nd command line argument to get Nth-latest folder. */ set "LATEST=%~2" set /A LATEST+=0 if %LATEST% LEQ 0 (set /P LATEST="Enter N [1]: " & set /A LATEST+=0) if %LATEST% LEQ 0 set /A LATEST=1 set /A INDEX=0 for /F "eol=| delims=" %%# in ('dir /B /A:D /O:-D "%~1"') do ( set /A INDEX+=1 setlocal EnableDelayedExpansion if !INDEX! EQU !LATEST! ( endlocal set "ITEM=%%#" goto :SKIP & rem // break loop after having retrieved Nth-latest folder; ) else endlocal ) :SKIP setlocal EnableDelayedExpansion if defined ITEM ( if %LATEST% EQU 1 (echo The latest file: !ITEM!) else ( if %LATEST% EQU 2 (echo 2nd-latest file: !ITEM!) else ( if %LATEST% EQU 3 (echo 3rd-latest file: !ITEM!) else ( echo %LATEST%th-latest file: !ITEM!))) ) endlocal endlocal exit /B

Nth-latest.bat