我正在寻找一种完成这项任务的方法。我尝试过 robocopy 并编写了一个批处理文件,但 robocopy 似乎无法做到这一点(因为 /MINAGE 不能处理时间,只能处理日期),而编写一个批处理文件来完成所有这些工作对我来说有点难以接受,因为它有点复杂,会变成意大利面条式的代码。
1)有人将文件上传到服务器(S 驱动器)上的源文件夹。
2)一些工作站定期检查S驱动器(每5分钟一次)。
3) 工作站在目标文件夹中有一个文件。如果工作站发现 S 驱动器中的文件比工作站上的目标文件夹中的文件更新,则工作站只会将最新的文件从 S 驱动器复制到目标文件夹。文件名在这里并不重要——只有时间戳才重要。
另一方面,如果工作站的目标文件夹中有一个与 S 驱动器上的时间戳相同或更新的文件(即使文件名不同),也不应该复制该文件。
4)工作站运行单独的批处理文件来重命名和处理新文件。
答案1
为了简化您的问题(据我理解),您需要:
- 查看源目录并获取最新文件
- 查看目标目录并获取最新文件
- 比较这两个文件的时间戳
- 如果源目录文件(步骤 1)比目标目录文件(步骤 2)新,则将其复制到目标目录。
- 如果已复制,请在目标目录中重命名新文件。
步骤 1 和 2可以用 for 循环执行:
设置 SOURCE_SERVER=\\server\source 设置 DEST_SERVER=C:\目标文件夹 设置 SOURCE_LATEST= 设置 DEST_LATEST= REM 源目录中的最新时间戳 对于/f“tokens = *”%% A在('dir“%SOURCE_SERVER%\ *。*”/ b / o:-d')中执行( 如果未定义 SOURCE_LATEST 设置 SOURCE_LATEST=%%~fA) REM 目标目录中的最新时间戳 对于/f“tokens = *”%% A在('dir“%DEST_SERVER%\ *。*”/ b / o:-d')中执行( 如果没有定义 DEST_LATEST,则设置 DEST_LATEST=%%~fA)
更多帮助请参见此处:如何编写 Windows 批处理脚本来从目录中复制最新文件?
步骤3:现在您知道每个位置的最新文件。是时候比较它们的时间戳来查看哪个文件较新了。我们可以使用 wmic 检索每个文件的时间戳,然后使用关系运算符进行比较:例如 20150129113038(等于 2015 年 1 月 29 日 11:30:38)大于 20150129112533(2015 年 1 月 29 日 11:25:33)。
设置目标文件日期= 设置 SOURCE_FILE_DATE= 对于/f“tokens=1 skip=1 delims=。” %%A in ('wmic datafile where name^="%SOURCE_LATEST:\=\\%" get "Last Modified"') do ( 如果未定义 SOURCE_FILE_DATE,则设置 SOURCE_FILE_DATE=%%A) 对于/f“tokens=1 skip=1 delims=。” %%A in ('wmic datafile where name^="%DEST_LATEST:\=\\%" get "Last Modified"') do ( 如果没有定义DEST_FILE_DATE设置DEST_FILE_DATE=%%A)
关于最后这个比较的其他想法可以在这里找到:如何在 DOS 批处理脚本中比较文件的时间戳?
步骤 4 和 5:最后,确定最新文件是否是源服务器上的文件,并根据需要复制+重命名。
如果“%SOURCE_FILE_DATE%”gtr“%DEST_FILE_DATE%”( REM 将源文件复制到目标并根据需要重命名。 复制“%SOURCE_LATEST%”“%DEST_SERVER%\新文件名.ext” ) 别的 ( REM 等待 5 分钟,然后重试 超时/T 300 转到:开始 )
答案2
以下批处理文件怎么样
xcopy "\\源服务器\源路径" "c:\目标路径" /C /D /Y
当然,仅当名称中有空格时才需要“”标记。
它使用 UTC 时间进行比较。(协调世界时)