我想要一个批处理文件,该文件将找出哪个是在目录中创建/修改的第二个最新文件夹。我找到了这篇文章,但是无论我尝试了多少,我都无法理解它的工作原理
@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文件夹,因为您需要定义另一个变量(例如 bl3
, bl4
,..., 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-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
:
Nth-latest.bat "C:somewhere" 2