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



我想要一个批处理文件,该文件将找出哪个是在目录中创建/修改的第二个最新文件夹。我找到了这篇文章,但是无论我尝试了多少,我都无法理解它的工作原理

@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

如果我使用它,那么我可以获得第二个最新文件夹,但是据说该脚本能够获得您需要的最新文件夹,无论是第一还是nth。有人可以告诉我,需要对脚本进行哪些修改才能实现这一目标。此外,此脚本的工作方式

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

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

@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的评论); n 默认为 1的空输入;
  • 提高了显示输出,以避免使用1th-latest2th-latest3th-latest等奇怪的东西;相反,The latest2nd-latest3rd-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

Nth-latest.bat "C:somewhere" 2

最新更新