无需多次 FOR 循环即可批量获取 n 个最近修改的文件
Batch get n most recently modified files without need of multiple FOR loops
如问题标题中所述,我有以下 DIR 命令来获取任何目录中最近修改的文件,提供命令或脚本在 运行ning 中的同一目录中的文件列表是待过滤。
dir /b /o:-d
但这里的怪癖是我想限制 most-recently-modified 文件列表中的文件数量,这样我就可以 运行 for 循环每个文件。这个列表需要在不使用多个 FOR 循环的情况下生成,我想不出任何方法来解决这个问题。我可以像下面这样遍历整个列表:
for /F "delims=" %%a in ('dir /b /o:-d') do echo %%a
当最近的 n 个文件已经列出时,如何可靠地严格停止此循环??
我建议您可以使用之前的示例并将其修改为接受 6,如下所示,您可以在其中通过命令行添加数字,您尝试进行更改但最好将此版本与 !count! 一起使用!而不是尝试 %%
Latest.cmd
用法:latest 6
@ECHO OFF
setlocal EnableDelayedExpansion
set "j=0"
set "count=%1"
FOR /f "delims=" %%i IN ('dir /b /a-d /o-d *.*') DO (
echo %%i
set /A j=j+1
if !j! geq !count! (
goto :end
)
)
:end
对于单行显示前 6 但继续不间断 转换为
cmd /V:ON /c "set "latest=6" & set "j=0" & echo/ & for /f "tokens=*" %F in ('dir /b /a-d /o-d *.*') do @set /A "j=!j!+1" >nul & if !j! leq !latest! echo %F"
一个更简单的版本 break after 说 6 个文件将是对 dbenham's answer
的修改
@echo off
set n=0
set count=6
for /f "usebackq delims==" %%F in (`dir /b /a-d /o-d *.*`) do (
echo %%F
set /a "n+=1, 1/(%count%-n)" 2>nul || goto :break
)
:break
set n=
set count=
对于 cmd 单行命令,它需要更复杂一些将末尾的 6 更改为您想要的数字。 (我相信其他人会做得更好!因为我是从 cmd 行嵌套 cmd)
cmd/r "@echo off&echo/&for /f "usebackq tokens=*" %F in (`dir /b /a-d /o-d *.*`)=do=(echo=%F&set /a "n+=1,1/(6-n)" 1>nul=2>nul||(exit /b))"
cmd
batch-file
.
中的另一种方法
SET "FILECOUNT=6"
powershell -NoLogo -NoProfile -Command ^
(Get-ChildItem -File ^| Sort-Object -Property LastWriteTime ^| Select-Object -Last %FILECOUNT%).Name
如问题标题中所述,我有以下 DIR 命令来获取任何目录中最近修改的文件,提供命令或脚本在 运行ning 中的同一目录中的文件列表是待过滤。
dir /b /o:-d
但这里的怪癖是我想限制 most-recently-modified 文件列表中的文件数量,这样我就可以 运行 for 循环每个文件。这个列表需要在不使用多个 FOR 循环的情况下生成,我想不出任何方法来解决这个问题。我可以像下面这样遍历整个列表:
for /F "delims=" %%a in ('dir /b /o:-d') do echo %%a
当最近的 n 个文件已经列出时,如何可靠地严格停止此循环??
我建议您可以使用之前的示例并将其修改为接受 6,如下所示,您可以在其中通过命令行添加数字,您尝试进行更改但最好将此版本与 !count! 一起使用!而不是尝试 %%
Latest.cmd
用法:latest 6
@ECHO OFF
setlocal EnableDelayedExpansion
set "j=0"
set "count=%1"
FOR /f "delims=" %%i IN ('dir /b /a-d /o-d *.*') DO (
echo %%i
set /A j=j+1
if !j! geq !count! (
goto :end
)
)
:end
对于单行显示前 6 但继续不间断 转换为
cmd /V:ON /c "set "latest=6" & set "j=0" & echo/ & for /f "tokens=*" %F in ('dir /b /a-d /o-d *.*') do @set /A "j=!j!+1" >nul & if !j! leq !latest! echo %F"
一个更简单的版本 break after 说 6 个文件将是对 dbenham's answer
的修改@echo off
set n=0
set count=6
for /f "usebackq delims==" %%F in (`dir /b /a-d /o-d *.*`) do (
echo %%F
set /a "n+=1, 1/(%count%-n)" 2>nul || goto :break
)
:break
set n=
set count=
对于 cmd 单行命令,它需要更复杂一些将末尾的 6 更改为您想要的数字。 (我相信其他人会做得更好!因为我是从 cmd 行嵌套 cmd)
cmd/r "@echo off&echo/&for /f "usebackq tokens=*" %F in (`dir /b /a-d /o-d *.*`)=do=(echo=%F&set /a "n+=1,1/(6-n)" 1>nul=2>nul||(exit /b))"
cmd
batch-file
.
SET "FILECOUNT=6"
powershell -NoLogo -NoProfile -Command ^
(Get-ChildItem -File ^| Sort-Object -Property LastWriteTime ^| Select-Object -Last %FILECOUNT%).Name