[英]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.