首页 > 解决方案 > 机器复制 | 只复制最新的一对文件

问题描述

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

我想要

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

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

标签: windowsbatch-filerobocopy

解决方案


@echo off & >nul chcp 65001

2>nul cd/d "C:\Source\" && set "_destiny=\\to\target\folder\." || (
      timeout /t -1 | echo\Path do not exist: C:\Source && goto :eOf ) 

for /f tokens^=* %%i in ('dir/b/a-d/o-d/tc .\financial*.*^|findstr/lei "\.pdf \.xlsx"'
      )do 2>nul robocopy .\. "%_destiny%" "%%~ni.xlsx" "%%~ni.pdf" /mov /njh|find "100%%"

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

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

2.如果文件夹存在,定义你的目标,如果它不存在(如果在错误的位置/工作站执行bat),中断并提醒你的用户..

2>nul cd/d    ...    && set "_destiny=\\to\target\folder\." || (
 timeout -1 | echo\Path do not exist: C:\Source && goto :eOf )

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

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

4.将循环命令的结果通知/传递给robocopy(仅文件名),但已限制复制(移动)两个扩展名,.\.以及源的当前文件夹 ( ) 和目标 ( %_destiny%)。

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

5.只是一个限制输出的建议,在每行显示 100% 的地方获取结果,将robocopy输出重定向到find.

robocopy    ...     |find "100%%"

Obs.: 1.你也可以在之前的循环中使用当前文件的名称来验证条件是否存在成对,使用...只有当两者都存在时,操作符(手段)才会执行你的命令:dir financial*.xlsx financial*.pdf&&return 0robocopy

  • @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.如果目标是移动一对,而不是对,只需添加& goto: eof,导致批处理/循环立即结束/中止。

  • @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%%" & goto :eOf)

Obs.: 3.如果由于某种原因需要move文件,其中一些文件已经存在于目标文件夹中,那么您将需要覆盖它,然后/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%%")

推荐阅读