繁体   English   中英

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

[英]Robocopy | copy only the newest pair of files

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

我想要

  • 只复制以"financial"开头的文件——因为这是它们之间的模式;
  • 总是一对:一个.xlsx和一个.pdf文件;
  • 我只需要复制newest的一对。
@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\." || (
      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. Go 到源文件夹,文件的源,抑制任何可能的错误( 2>nul ):

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

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

2>nul cd/d    ...    &&  || (
 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.只是一个限制 output 的建议,在每行显示 100% 的地方获取结果,将robocopy output 重定向到find

robocopy    ...     |find "100%%"

.xlsx .pdf ... only if there are both, the && operator (means return 0 ) will execute the your robocopy command: dir .xlsx .pdf可以在先前验证条件是否存在的循环中使用当前文件的名称成对存在&&运算符(表示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/ad/od/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/ad/od/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文件,其中一些文件已经存在于目标文件夹中,那么您需要覆盖它,然后在您的robocopy命令中使用/添加/IS 这是

  • @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%%")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM