2017-01-28 60 views
0

我有文件的文件夾和一個.txt文件,文件名和份數的名單,我需要複製從一個文件夾到另一個號碼。批處理文件移動基於列表中的文件,而不會覆蓋舊的文件,並拷貝

該腳本複製文件,但如果.txt文件具有相同名稱的兩個文件,它會覆蓋舊的文件。

在名單上有:

file1.txt 1 
file2.txt 1 
file1.txt 3 
file2.txt 2 

我要實現以下目標:

file1.txt 
file2.txt 
file1(1).txt 
file1(2).txt 
file1(3).txt 
file2(1).txt 

這是我的代碼至今:

@echo off 
set Source=C:\Users\siddique.gaffar\Desktop\Artworks 
set Target=C:\Users\siddique.gaffar\Desktop\Artworks Copy 
set FileList=C:\Users\siddique.gaffar\Desktop\Artwork TXT File\Book1.txt 
echo. 

if not exist "%Source%" echo Source folder "%Source%" not found & goto Exit 
if not exist "%FileList%" echo File list "%FileList%" not found & goto Exit 
if not exist "%Target%" md "%Target%" 

for /F "delims=" %%a in ('type "%FileList%"') do copy "%Source%\%%a" "%Target%" 


:Exit 
echo. 
echo press the Space Bar to close this window. 
pause > nul 
+1

問題是模糊的。該批處理是否應避免覆蓋目標中已存在的文件,或者是否應該在文件列表中提及雙重文件時複製源文件? – LotPings

+1

如果目標文件中還有一個'file1(1).txt'怎麼辦? – aschipfl

+0

相關:[使批處理文件保留兩個文件時發生名稱衝突](http://stackoverflow.com/q/14033582) – aschipfl

回答

0

下應該做的伎倆:

@echo off 
set Source=C:\Users\siddique.gaffar\Desktop\Artworks 
set Target=C:\Users\siddique.gaffar\Desktop\Artworks Copy 
set FileList=C:\Users\siddique.gaffar\Desktop\Artwork TXT File\Book1.txt 
echo. 
if not exist "%Source%" echo Source folder "%Source%" not found & goto Exit 
if not exist "%FileList%" echo File list "%FileList%" not found & goto Exit 
if not exist "%Target%" md "%Target%" 

for /F "usebackq tokens=1-2" %%a in ("%FileList%") do call :CopyFile "%%a" %%b 


:Exit 
echo. 
echo press the Space Bar to close this window. 
pause > nul 
exit /b 0 

:CopyFile 
:: first argument = filename 
:: second argument = number of copies 

REM A little trick that will put limit on 0 if second argument is empty or not a number 
set secondarg=%~2 
set /a limit=secondarg 

REM if limit is invalid (not strict positive), exit the function 
IF %limit% LEQ 0 (
    echo Invalid number of copies 
    exit /b 1 
) 
IF NOT EXIST "%Target%\%~1" (
    copy "%Source%\%~1" "%Target%" 
    IF %limit% LEQ 1 exit /b 0 
    set /a limit-=1 
) 

REM File already exists: search correct index for filename 
set index=0 
set "targetfile=%target%\%~n1" 
set file_ext=%~x1 

:following 
set /a index+=1 
Rem if file with index %index% already exists, go back to get following index 
IF exist "%targetfile%(%index%).%file_ext%" goto :following 

Rem we have the correct index, now we can copy 
set /a limit=index+limit-1 
FOR /L %%g IN (%index%,1,%limit%) DO copy "%Source%\%~1" "%targetfile%(%%g).%file_ext%" 
exit /b 0 

,如果你有長文件名,另一種選擇是使用usebackq和周圍加上雙引號的路徑在for f循環,而不是分析type命令的輸出。

函數:CopyFileIF EXIST檢查文件是否存在,並使用計數器爲新文件的文件名查找下一個索引。它使用path manipulation構建一個帶有索引的新文件名。

編輯:我添加了從文本文件中讀取所需的副本數並將該數字指定爲:CopyFile函數的第二個參數的可能性。如果沒有給出號碼或號碼不是嚴格的正數(大於0),它將不會複製。

PS:「小伎倆」我用,將設置%limit%爲0的情況下,第二個參數是空的作品,因爲set/a標誌將取代空變量爲0。這個如果你使用參數變量將無法正常工作直接的回答:如果第二個參數爲空

set /a limit=%~2 

將拋出一個錯誤,因爲CMD解析器將取代%~2一個空字符串,它會執行set /a limit=這是使用/a標誌無效assignement。但是,如果你使用一個額外的變量作爲過境

set var=%~2 
set /a limit=var 

你讓set處理變量擴展,而不是CMD解釋。 set將看到var變量爲空(在%2爲空的情況下),並將用0替換它。

+0

很抱歉,通知我出現以下錯誤系統找不到指定的文件。 系統找不到指定的文件。 系統找不到指定的文件。 系統找不到指定的文件。 按空格鍵關閉此窗口。 – sid

+0

對不起有同樣的錯誤 – sid

+0

@sid我忘了在副本中添加源目錄。現在應該沒問題 –

0
@echo off 
set "Source=C:\Users\siddique.gaffar\Desktop\Artworks" 
set "Target=C:\Users\siddique.gaffar\Desktop\Artworks Copy" 
set "FileList=C:\Users\siddique.gaffar\Desktop\Artwork TXT File\Book1.txt" 
setlocal EnableDelayedExpansion 
for /f "delims=" %%a in ('type "%FileList%"') do (
if not defined count set "count=1" 
cd "%Target%" 
if exist %%a (
set "curfile=%%a" 
set "curfile=!curfile:~0,-4!" 
set "curfile=!curfile!(!count!).txt" 
if exist !curfile! (
set /a "count=!count! + 1" 
set "curfile=%%a" 
set "curfile=!curfile:~0,-4" 
set "curfile=!curfile!(!count!).txt" 
) 
cd "%Source%" 
ren "%Source%\%%a" "!curfile!" 
xcopy "%Source%\!curfile!" "%Target%" 
ren "%source%\!curfile!" "%%a" 
) else (
xcopy "%Source%\%%a" "%Target%" 
) 
) 
pause 

這段代碼替換所有代碼。 把這個批處理文件放在同一個目錄中,你的文件要複製的是。 p。 s .:現在只適用於.txt文件。

+0

感謝您的回覆,對不起,但沒有工作 – sid

+1

@sid,「它沒有不工作「不是一個相當準確的錯誤描述,是嗎? – aschipfl

+0

對不起沒有任何錯誤,CMD打開和關閉,沒有複製任何東西,也許我沒有把代碼正確 – sid