我想要一个批处理文件,它会找出哪个是目录中创建/修改的第二个最新文件夹。 我找到了这篇文章,但无论我多么努力,我都无法理解它是如何工作的
@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个。 有人可以告诉我需要对脚本进行哪些修改才能完成。这个脚本究竟是如何工作的
答案 0 :(得分:0)
在您的方法中,最新文件夹已在变量bl1
中可用;在%bl1%
之前的末尾添加echo endlocal
以显示它。使用该脚本无法灵活地检索 n 文件夹,因为您需要定义另一个变量(例如bl3
,bl4
,...,{循环中的{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
不再丢失; !
; 1
,1th-latest
和2th-latest
这样奇怪的事情;相反,分别返回3th-latest
,The latest
和2nd-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