我必须每天将前100个具有特定文件扩展名的文件复制到另一个文件夹。
源文件夹看起来像这样:
sourcefolderParentFolderA
├───folder1
│ └──────file_a.dat
├───folder2
│ └──────file_b.dat
└───folder3
└──────file_c.dat
我需要抓取最新的100个.dat
文件-ParentFolderA
下的每个文件夹中只有一个.dat
文件-并将它们复制到一个新文件夹。
这是我目前为止写的:
@echo off
setlocal enableextensions enabledelayedexpansion
set /a "index = 0"
set /a "count = 99"
set "source=sourcefolderParentFolderA"
set "destination=destinationfoldersomerandomFoldername"
:whileloop
if %index% leq %count% (
echo %index%
for /R "%source%" %%f in (*.dat) do copy %%f "%destination%"
set /a "index = index + 1"
goto :whileloop
)
endlocal
timeout 10
其中一些会被删除,因为我只是在那里帮助我写它。最终的行为是获取这100个最新的.dat
文件。当前正在抓取ALL每个子文件夹中的.dat文件,但它永远不会终止,因为它没有机会到达代码的递增部分。(在进入这一步之前,它必须浏览数千个文件夹)。
您需要一个按日期/时间排序的所有文件列表。在cmd
中没有能够执行此递归的命令。但我在这个答案中使用了一个技巧:暂时将日期格式设置为可排序格式,获取列表并将其设置回原始格式:
@echo off
setlocal EnableDelayedExpansion
set /a "count=100"
set "source=sourcefolderParentFolderA"
set "destination=destinationfoldersomerandomFoldername"
REM get current short date format:
for /f "tokens=2,*" %%a in ('reg query "HKCUControl PanelInternational" /v sShortDate') do set orig-format=%%b
REM set short format to yyyy.MM.dd:
reg add "HKCUControl PanelInternational" /v sShortDate /d "yyyy.MM.dd" /f >nul
REM get a recursive listing with format "YYYY.MM.DD hh:mm <full qualified file name>":
(for /F "delims=" %%a in ('dir /a-d /T:W /S /B "%source%*"') do @echo %%~Ta "%%a")|sort /r>report.csv
REM set short date format back to original settings:
reg add "HKCUControl PanelInternational" /v sShortDate /d "%orig-format%" /f >nul
REM copy the first %count% files:
set n=0
for /f "tokens=2,*" %%a in (report.csv) do (
set /a n+=1
if !n! gtr %count% goto :done
ECHO copy %%b "%destination%"
)
:done
echo done.
使/T:W
适应您的需要。
注:I " disarmmed "出于安全考虑,请使用copy
命令。当它像你想要的那样工作时,只需删除ECHO
。
(抱歉在for
循环中引用了文件名)。我知道这是个坏习惯,但是是必要的,因为sort
设法在每行的末尾添加一个空格。)
@ECHO OFF
SETLOCAL
rem The following settings for the source directory, destination directory, target directory,
rem batch directory, filenames, output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:your files"
SET "destdir=u:your results"
:: I used 20 files for my test
SET /a maxfiles=20
:: I chose to process all the .T* files
FOR /r "%sourcedir%" %%b IN (*.t*) DO COPY "%%b" "%destdir%" >NUL
FOR /f "skip=%maxfiles%delims=" %%b IN ('DIR /b /a-d /o-d "%destdir%*.t*" ') DO ECHO DEL "%destdir%%%b"
GOTO :EOF
既然您似乎对构建目标文件的完整副本没有异议,那么所需要做的就是按逆日期顺序从目录列表中删除所有文件,跳过所需的保留数量。
echo del
用于验证,以确保目录是正确的。修改echo del
为del
执行删除。