复制 |只复制最新的一对文件

Robocopy | copy only the newest pair of files

我一直在尝试编写一个脚本来复制一对文件。它们几乎是同一个文件:一个在 .xlsx 中,另一个在 .pdf 中。作为财务报告,需要创建时会创建一对(更不用说随机了)。每个项目文件夹都有很多对。

我要

@CHCP 65001
@echo off
robocopy "C:\source" "C:\dest" financial* (.xlsx*.pdf*) /XO /E /R:3
pause

我上面写的代码帮助了我。但它不符合我的第三个条件,即只复制最新的一对。有人知道怎么做吗?

@echo off & >nul chcp 65001

2>nul cd/d "C:\Source\" && set "_destiny=\\to\target\folder\." || (
      超时/t -1 | echo\Path 不存在:C:\Source && goto :eOf )

对于 /f 代币^=* %%i in ('dir/b/a-d/o-d/tc .\financial*.*^|findstr/lei "\.pdf \.xlsx"'
      ) 执行 2>nul robocopy .\. "%_destiny%" "%%~ni.xlsx" "%%~ni.pdf" /mov /njh|找到 "100%%"</pre>

1. 转到源文件夹,文件源,抑制任何可能的错误(2>nul):

2>nul cd/d "C:\Source\."

2.如果文件夹存在,定义你的target,如果不存在(如果bat在错误的location/work站执行),中断和提醒您的用户..

2>nul cd/d ... && <b><i>set "_destiny=\\to\target\folder\."</b> </i> || (
<b> 超时-1 | echo\Path 不存在: C:\Source && goto :eOf</b> )

3. 列出您的文件以获得文件夹中的最新文件,并将该列表重定向到 Findstr 以从字面上过滤您以查找结尾的文件所需的扩展名。

dir<b>/b/a-d/o-d/tc .\financial*.*^|findstr/lei "\.pdf \.xlsx"</b>

4. Inform/pass 到 robocopy 的循环命令的结果(仅文件名)但已经限制复制(移动)两个扩展名,还有源的当前文件夹 (.\.) 和目标 (%_destiny%).

robocopy .\. "%_destiny%" "%%~ni.xlsx" "%%~ni.pdf" /mov /njh

5. 只是一个限制输出的建议,将每行出现的结果 100%,将 robocopy 输出重定向到 find.

robocopy    ...     |find "100%%"

Obs.: 1. 也可以在之前验证条件成对存在或不存在的循环中使用当前文件的名称,使用dir <i>财务*</i><b>.xlsx</b> <i>财务*</i><b>.pdf</b>... 只有当两者都存在时,&& 运算符(即 return 0)才会执行您的 robocopy 命令:

  • @echo off 
     
    2>nul cd/d "C:\Source\." && set "_destiny=\to\target\folder\." || (
         timeout -1 | echo\Path do not exist: C:\Source && goto :eOf )
     
    1>nul chcp 65001 && set "_cmd=dir/b/a-d/o-d/tc .\"financial*.*""
     
    for /f tokens^=* %%i in ('%_cmd%^|findstr/lei "\.pdf \.xlsx"')do 2>nul dir /b .\"%%~ni.xlsx" .\"%%~ni.pdf" && (
         2>nul robocopy .\. "%_destiny%" "%%~ni.xlsx" "%%~ni.pdf" /mov /njh|find "100%%")
    

Obs.: 2. 如果 objective 是移动一对,而不是对,只需添加 & goto: eof,导致 batch/loop 立即 end/abort。

  • @echo 关闭
    
    2>nul cd/d "C:\Source\" && set "_destiny=\\to\target\folder\." || (
       超时-1 | echo\Path 不存在:C:\Source && goto :eOf )
    
    1>nul chcp 65001 && set "_cmd=dir/b/a-d/o-d/tc .\"financial*.*""
    
    for /f tokens^=* %%i in ('%_cmd%^|findstr/lei "\.pdf \.xlsx"')do 2>nul dir /b .\"%%~ni.xlsx" .\"%%~ni.pdf" && (
        2>nul robocopy.\. "%_destiny%" "%%~ni.xlsx" "%%~ni.pdf" /mov /njh|find "100%%" <b>& goto :eOf</b> )
    

Obs.: 3. 如果出于某种原因需要 move 文件,其中一些文件已经存在于目标文件夹中,那么您将需要覆盖它,然后 use/add /IS 在你的 robocopy 命令中。 是

  • @echo off 
      
     1>nul chcp 65001 & set "_cmd=dir /b/a:-d/o:-d/t:c ".\financial*.*""
     2>nul cd /d "C:\Source\." && set "_target=\to\target\folder\." || (
     timeout /t -1 | echo\Path/Source do not exist: C:\Source & goto :eOf)
      
     for /f tokens^=* %%i in ('2^>nul %_cmd% ^|findstr/lei "\.pdf \.xlsx"')do 2>nul (
     2>nul robocopy .\. "%_target%" "%%~ni.xlsx" "%%~ni.pdf" /mov /njh /is|find "100%%")