批处理:复制文件的最后修改时间是15分钟前

时间:2018-11-08 11:01:10

标签: windows batch-file time

我有一个自动创建文件的文件夹,我需要每5分钟复制一次新文件(即,最近5分钟内最后一次修改的文件)。

@PreRemove / @PostRemove
public void someMethod() { ... }

这就是我发现获取文件日期的方式,但是我不知道如何比较并在不到5分钟的时间里获取当前日期。

(复制命令不是必需的,因为通过SSH可以解决此问题)。

2 个答案:

答案 0 :(得分:1)

在批处理日期中,时间计算是一项非常繁琐的任务。

我建议使用PowerShell(至少作为工具)

要获取最近5分钟在当前目录中创建的文件。
此powershell命令将输出类似dir的清单:

Get-ChildItem -Path 'X:\path'|Where-Object {((Get-Date) - $_.LastWriteTime).TotalMinutes -le 5}

要将其限制为仅全名,您可以附加管道

| Select-Object -ExpandProperty FullName

或仅将命令括在括号中并附加(...)。FullName

(Get-ChildItem -Path 'X:\path'|Where-Object {((Get-Date) - $_.LastWriteTime).TotalMinutes -le 5}).FullName

分批包装

:: Q:\Test\2018\11\08\SO_53206386.cmd
@Echo off
for /f "usebackq delims=" %%A in (`
  powershell -Nop -C "(Get-ChildItem -Path 'X:\path' -File |Where-Object {((Get-Date) - $_.LastWriteTime).TotalMinutes -le 15}).FullName"
`) Do Echo %%A

此批次的示例输出(列出自身)

> SO_53206386.cmd
Q:\Test\2018\11\08\SO_53206386.cmd

-File参数需要PowerShell v3 +,但可以用另一个管道命令替换

| Where-Object {!($PSISContainer)}

过滤出文件夹。 (相反是-Directory或没有!否)

@Echo off
for /f "usebackq delims=" %%A in (`
  powershell -Nop -C "(Get-ChildItem -Path 'X:\path' | Where-Object {!($PSISContainer)}| Where-Object {((Get-Date) - $_.LastWriteTime).TotalMinutes -le 15}).FullName"
`) Do Echo %%A

答案 1 :(得分:1)

这里是一个完全不同的解决方案,最有可能导致相同的行为,其优点是文件的最后修改日期实际上并不重要。因此,如果将文件复制到观察到的文件夹中,则即使文件的最后修改时间不在最近的 X 分钟之内,也会对其进行处理。每当在文件夹中创建文件或由进程修改文件时,它将自动使用Windows设置的存档文件属性。

@echo off
set "Folder=C:\test"
:loop
for /F "eol=| delims=" %%I in ('dir "%Folder%\*" /AA-D-H /B /ON 2^>nul') do (
    %SystemRoot%\System32\attrib.exe -a "%Folder%\%%I"
    echo Copy the file "%Folder%\%%I"
)
%SystemRoot%\System32\timeout.exe /T 300
goto loop

命令 FOR 在以cmd.exe /C为背景的单独命令过程中执行以下命令行。

dir "C:\test\*" /AA-D-H /B /ON 2>nul

命令 DIR 输出

  • 由于/B,仅以裸格式显示文件名和文件扩展名
  • 仅因/AA-D-H而设置了存档属性的非隐藏文件
  • 由于/ON而按文件名排序(并非必需)
  • 在目录C:\test中与通配符模式*匹配。

通过将 DIR 从句柄 STDERR 重定向到设备 NUL ,可以抑制 DIR 找不到任何符合这些要求的目录条目所输出的错误消息。

阅读有关Using Command Redirection Operators的Microsoft文章,以获取2>nul的解释。当Windows命令解释器在执行命令之前处理此命令行时,重定向操作符>必须在 FOR 命令行上使用脱字符号^进行转义,才能被解释为文字字符。 FOR ,它将在后台启动的单独命令进程中执行嵌入式dir命令行。

DIR 在单独命令过程中的输出由 FOR 捕获并逐行处理。

空行总是被 FOR 跳过,此处不会出现。

默认情况下, FOR 也会跳过以分号开头的行(文件名)。通过使用eol=|将行尾字符从默认;更改为竖线(该文件名在任何地方都不能拥有)来禁用此行为。

FOR 默认情况下使用空格/制表符作为分隔符将子字符串(令牌)中的行拆分,并仅将第一个空格/制表符分隔的字符串分配给指定的循环变量I。这里不希望出现这种情况,因为文件名可以包含一个或多个空格。因此,delims=用于指定一个空的定界符列表,以禁用行分割行为。

因此分配给循环变量I的是具有<扩展名> DIR 输出的不带路径的文件扩展名。

命令 ATTRIB 用于从当前文件中删除存档属性,以供 FOR 循环的下一次迭代使用。然后,可以将文件复制到其他位置或进行处理,否则不修改其内容。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • attrib /?
  • dir /?
  • echo /?
  • for /?
  • goto /?
  • timeout /?