windows - 机器复制 | 只复制最新的一对文件
问题描述
我一直在尝试编写一个脚本来复制一对文件。它们几乎是同一个文件:一个在.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.转到源文件夹,文件的源,抑制任何可能的错误(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 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.如果目标是移动一对,而不是对,只需添加& 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%%")
推荐阅读
- activerecord - 在 yii 框架中使用 via 与多对多关系
- c++ - 处理套接字的 WSA_IO_PENDING ::send
- python - FMUException:加载二进制文件时出错。无法加载 DLL:动态链接库 (DLL) 初始化例程失败
- java - 类型不匹配:无法从 ByteMatrix 转换为 BitMatrix
- tcpdf - TCPDF WriteHTML() 创建的链接不可点击
- java - HttpURLConnection#getResponseCode() 导致 FileNotFoundException
- vim - 如何退出 iTerm2 Vim 上的备用屏幕滚动?
- sql - MS Access 选择表中的第 N 个最高值
- mysql - Oracle 和 MySQL 日期列格式
- ruby - 获取加载的 database_clenaer gem 版本