簡體   English   中英

批處理:復制上次修改時間為 15 分鍾前的文件

[英]Batch: Copy files which last modification were 15 minutes before

我有一個自動創建文件的文件夾,我需要每 5 分鍾復制一次新文件(即最后一次修改是在最后 5 分鍾內的文件)。

 :loop
for %a in (C:\test\*) do (
 set FileDate=%~ta
)
 timeout /t 300
 goto loop

這就是我發現獲取文件日期的方式,但我不知道如何比較並獲得當前日期少於 5 分鍾。

(復制命令不是必需的,因為是通過 SSH 並且此問題已解決)。

在批處理中,日期時間計算是一項非常繁瑣的任務。

我建議使用 PowerShell(至少作為一種工具)

獲取最近 5 分鍾在當前目錄中創建的文件。
此 powershell 命令將輸出類似dir的列表:

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

要將其限制為僅 FullName,您可以附加管道

| 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 or no ! for not)

@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

這是一個完全不同的解決方案,很可能導致相同的行為,其優點是文件的最后修改日期並不重要。 因此,如果將文件復制到觀察文件夾中,即使其最后修改時間不在最后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-DH ,僅具有歸檔屬性集的非隱藏文件
  • 由於/ON按文件名排序(實際上不需要)
  • 在目錄C:\test中找到匹配通配符模式*

DIR在找不到任何符合這些要求的目錄條目時輸出的錯誤消息通過將其從句柄STDERR重定向到設備NUL來抑制。

閱讀有關使用命令重定向運算符的 Microsoft 文章,了解2>nul的說明。 重定向運算符>必須在FOR命令行上使用脫字符^進行轉義,以便在 Windows 命令解釋器在執行命令FOR之前處理此命令行時解釋為文字字符,該命令使用在后台啟動的單獨命令進程執行嵌入式dir命令行。

這個DIR在單獨的命令過程中的輸出被FOR捕獲並逐行處理。

FOR總是跳過空行,這里不會出現。

FOR也默認跳過以分號開頭的行(文件名)。 通過使用eol=|更改禁用此行為默認的行尾字符; 到任何文件名都不能有的豎線。

FOR默認使用空格/制表符作為分隔符拆分子字符串(標記)中的行,並將第一個空格/制表符分隔的字符串分配給指定的循環變量I 此處不需要此行為,因為文件名可以包含一個或多個空格。 出於這個原因, delims=用於指定一個空的分隔符列表,該列表禁用行拆分行為。

因此,分配給循環變量I的是帶有文件擴展名的文件名,由DIR輸出,沒有路徑。

命令ATTRIB用於從當前文件中刪除歸檔屬性,以用於 FOR循環的下一次迭代。 然后可以將文件復制到不同的位置或進行處理,否則不會修改其內容。

要了解使用的命令及其工作原理,請打開命令提示符窗口,在其中執行以下命令,並仔細閱讀每個命令顯示的所有幫助頁面。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM