繁体   English   中英

从未知目录中的txt复制最新文件集

[英]copying most recent file set from txt in unknown directory

我有一个notepad.txt文档,列出了需要复制到保存批处理文件的文件夹的文件。 这些文件位于几个子目录中,使用我的代码,它会复制具有指定名称的所有文件。

for /f "delims=" %%i in (testlist.txt) do echo |robocopy "%dir1%." "C:\temporary" "%%i.*" /s /ndl /njs /njh /nc /ts /ns

我如何正确设置它以便它将搜索最新的文件,并只复制文件而不是文件夹和子文件夹?

如何在Windows命令行上获取文件的上次修改日期?

for %a in (MyFile.txt) do set FileDate=%~ta

比较Windows批处理文件中的2个日期

set "sdate1=%olddate:~-4%%olddate:~3,2%%olddate:~0,2%"
set "sdate2=%newdate:~-4%%newdate:~3,2%%newdate:~0,2%"
if %sdate1% GTR %sdate2% (goto there)  else echo here

因此,鉴于您已经可以读取文件并执行复制,这里是我要编写的逻辑的伪代码,以便将它们放在一起:

set oldTimeStamp = "1901-01-01" //so first comparison wins and doesn't throw a null error
for each filename in list.txt
   set newTimestamp = getTimeStamp(filename)
   if newTimeStamp > oldTimeStamp then set fileToCopy = filename
   set oldTimeStamp = newTimeStamp
next
doCopy(fileToCopy)

基本上遍历每个文件名并获取时间戳。 存储上一个文件的时间戳,并比较新旧时间戳。 如果当前版本较新,请将文件名保存到您将用于复制的变量中。 在循环结束时, fileToCopy应包含具有最近修改时间的文件的名称。

以下代码段检索最新文件并回显其路径。 这里wmic命令用于获取标准化的与语言环境无关的时间戳,可以立即将其作为字符串进行比较,因此不必将它们转换为数字。 所以这里是:

@echo off
setlocal EnableExtensions EnableDelayedExpansion

set "RECENT=00000000000000.000000+000"
set "RECENTFILE="
for /F "usebackq eol=| delims=" %%L in ("testlist.txt") do (
    setlocal DisableDelayedExpansion
    set "CURRFILE=%%~fL"
    if exist "%%~fL" (
        setlocal EnableDelayedExpansion
        for /F "skip=1 tokens=1 delims= " %%T in ('
            wmic DATAFILE ^
            WHERE Name^="!CURRFILE:\=\\!" ^
            GET LastModified ^
            /FORMAT:TABLE
        ') do (
            for /F "delims=" %%S in ("%%T") do (
                if %%S GTR !RECENT! (
                    endlocal
                    endlocal
                    set "RECENT=%%S"
                    set "RECENTFILE=%%~fL"
                ) else (
                    endlocal
                    endlocal
                )
            )
        )
    ) else (
        endlocal
    )
)
if defined RECENTFILE (
    rem Perform your action here:
    echo(!RECENTFILE!
)

endlocal
exit /B

怎么了:

  • 有两个变量RECENTRECENTFILE分别保存最新文件的时间戳和路径;
  • 外部for /F循环遍历列表文件testlist.txt的项目;
  • 对于每个现有项,执行wmic查询以获取最后的修改日期,并且其输出由两个嵌套的for /F循环解析,每个迭代仅一次; 因为wmic返回Unicode字符串,单个for /F循环是不够的,因为它留下了一些孤立的回车字符,这可能会影响剩余的代码,但是第二个循环会删除它们;
  • 将检索到的文件日期与RECENT的缓冲日期进行比较,如果更大,则意味着文件更新,它存储在RECENT ,相应的文件路径存储在RECENTFILE ;
  • 如果最终没有定义变量RECENTFILE ,则列表testlist.txt不指向现有文件,或者它是空的;
  • 为了避免任何特殊字符出现问题,必须进行延迟扩展的切换;

除了事实之外,与获取使用for的时间戳相比, wmic查询在性能方面更差(例如, for %F in ("*.*") do echo %~tF ),以下限制适用:

,字符不能出现在任何列出的文件路径!

根据这个答案 ,有一种方法可以克服这个问题,但是不允许使用)字符:替换子句WHERE Name^="!CURRFILE:\\=\\\\!" by WHERE ^(Name^="!CURRFILE:\\=\\\\!"^) (仅当wmic命令行放在for /F集中时,才需要括号的转义^ )。 所以,你可以拥有,)一个内wmic命令行,但不能同时这些字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM