[英]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
我如何正确设置它以便它将搜索最新的文件,并只复制文件而不是文件夹和子文件夹?
for %a in (MyFile.txt) do set FileDate=%~ta
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
怎么了:
RECENT
和RECENTFILE
分别保存最新文件的时间戳和路径; 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.