当源文件比任何目标文件都新时,如何将文件复制到目标?

当源文件比任何目标文件都新时,如何将文件复制到目标?

我正在寻找一种完成这项任务的方法。我尝试过 robocopy 并编写了一个批处理文件,但 robocopy 似乎无法做到这一点(因为 /MINAGE 不能处理时间,只能处理日期),而编写一个批处理文件来完成所有这些工作对我来说有点难以接受,因为它有点复杂,会变成意大利面条式的代码。

1)有人将文件上传到服务器(S 驱动器)上的源文件夹。

2)一些工作站定期检查S驱动器(每5分钟一次)。

3) 工作站在目标文件夹中有一个文件。如果工作站发现 S 驱动器中的文件比工作站上的目标文件夹中的文件更新,则工作站只会将最新的文件从 S 驱动器复制到目标文件夹。文件名在这里并不重要——只有时间戳才重要。

另一方面,如果工作站的目标文件夹中有一个与 S 驱动器上的时间戳相同或更新的文件(即使文件名不同),也不应该复制该文件。

4)工作站运行单独的批处理文件来重命名和处理新文件。

答案1

为了简化您的问题(据我理解),您需要:

  1. 查看源目录并获取最新文件
  2. 查看目标目录并获取最新文件
  3. 比较这两个文件的时间戳
  4. 如果源目录文件(步骤 1)比目标目录文件(步骤 2)新,则将其复制到目标目录。
  5. 如果已复制,请在目标目录中重命名新文件。

步骤 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 时间进行比较。(协调世界时)

相关内容