首页 > 解决方案 > 复制最后 15 个创建的文件

问题描述

我有 Microsoft Batch 文件,并且在代码的一部分中,我将最后创建的具有特定命名约定的文件从文件夹 (RootDir) 复制到另一个文件夹 (CopyDir)。但现在我需要复制最近创建的 15 个相同类型的文件。你能帮我吗?

set lastmod=
pushd %RootDir%
for /f "tokens=*" %%a in ('dir _UnipolSai_Outlier_Daily_Report_Agg1__UnipolSai_Outlier_Daily_Report_Agg1*.gz /b /o-d /a-d 2^>NUL') do set lastmod=%%a & goto :xx
:xx
if "%lastmod%"=="" echo Could not locate files.&goto :eof
:::
copy /Y "%lastmod%" "%CopyDir%"

标签: batch-file

解决方案


@ECHO OFF
SETLOCAL
SET "sourcedir=."
SET /a required=15
:: remove variables starting #
FOR  /F "delims==" %%a In ('set # 2^>Nul') DO SET "%%a="

FOR /f "delims=" %%a IN ('dir /b /a-d /o-d "%sourcedir%\*" ') DO (
 SET "#0=Y"
 FOR /L %%b IN (1,1,%required%) DO IF DEFINED #0 IF NOT DEFINED #%%b (
  SET "#0="
  SET "#%%b=%%a"
  ECHO process "%%a"
  IF defined #%required% GOTO done
 )
)
SET "#0="
:done
SET #
:: remove variables starting #
FOR  /F "delims==" %%a In ('set # 2^>Nul') DO SET "%%a="

GOTO :EOF

您需要更改设置sourcedir以适应您的情况。

您显然对这些选项很熟悉dir,所以我会留下这个问题。

这种方法清除所有以 开头的变量#,然后#0用作标志来确定他的文件名是否已被处理。首先将其设置为某个值,然后检查#1..#15。

如果未定义#n,则将其设置为正在处理的数据行并清除因此每行#0只有一个#nset。我只选择echo了找到的文件名 - 显然,这可以是您选择的任何处理。

一旦#15设置完毕,终止循环 - 找到的每个值都可以作为奖励#?


推荐阅读