2016-10-04 25 views
1

我在尋找一些幫助來設置批處理腳本來遍歷整個目錄並複製所有.sql文件到一個文件夾。我可以用FOR循環做到這一點,但如果兩個或更多不同目錄中的文件具有相同的名稱,我會遇到困難。我試圖用計數器來解決這個問題,但是我無法使它針對單個文件名。批處理文件將一棵樹中的所有.sql文件複製到一個文件夾中使用同名文件的計數器

我迄今爲止代碼:

set /A n=0 

for /R %source% %%G in (*.sql) do (
    if exist %destination%\sql_files\%%~nxG (
     set /A n+=1 
     set "full=%%G" 
     set "name=%%~nG" 
     set "ext=%%~xG" 
     setlocal enabledelayedexpansion 
     copy "!full!" "!destination!\sql_files\!name!(!n!)!ext!" >nul 
     endlocal 
    ) else (
     copy "%%G" "%destination%\sql_files\" >nul 
    ) 
) 

例如,如果我有:

%source%\dir1\file1.sql 
%source%\dir1\file2.sql 
%source%\dir2\file1.sql 
%source%\dir2\file2.sql 
%source%\dir3\file1.sql 

我結束了:

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

我想看到的是:

file1.sql 
file1(1).sql 
file1(2).sql 
file2.sql 
file2(1).sql 

我認爲我的答案可能在於一個子程序,但我不能完全弄清楚,使這項工作的邏輯。任何幫助是極大的讚賞。

+1

[複製文件作爲另一名如果文件存在(的可能的複製http://stackoverflow.com/questions/13659369/copy-file-as -otherother-name-if-file-exist) – aschipfl

+0

核心問題:你永遠不會重置計數器'n'。你的任務似乎對我來說不是微不足道的。我認爲你需要推遲返回的源文件,因爲計數器'n'鏈接到文件名,但不鏈接到包含子目錄。目標目錄最初保證爲空,或者那裏可能已有文件? – aschipfl

+0

目標目錄將爲空。 –

回答

0

這是一個腳本,可以做你想做的。它依賴於一個事實,即目標目錄最初是空的:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "SOURCE=." 
set "DESTINATION=..\sql_files" 
set "PATTERN=*.sql" 
set "TMPFILE=%TEMP%\%~n0_%RANDOM%.tmp" 

rem // Create target directory, check whether it is empty: 
2> nul md "%DESTINATION%" 
(2> nul dir /B /A "%DESTINATION%\*.*" | > nul find /V "") && (
    >&2 echo Target directory "%DESTINATION%" is not empty! 
    exit /B 1 
) 

rem /* Write list of files to temporary file; each line holds 
rem the pure file name and the full path, separated by `:`: */ 
if not defined SOURCE set "SOURCE=." 
> "%TMPFILE%" (
    for /R "%SOURCE%" %%F in ("%PATTERN%") do (
     echo :%%~nxF:%%~fF 
    ) 
) 

rem // Read temporary file with lines sorted by file names: 
set "PREV=:" & set /A "INDEX=0" 
for /F "tokens=1,* delims=:" %%E in ('sort "%TMPFILE%"') do (
    rem // Cache file name parts and full path: 
    set "FILE=%%E" 
    set "NAME=%%~nE" 
    set "EXT=%%~xE" 
    set "FULL=%%F" 
    rem // Compare current with previous file name: 
    setlocal EnableDelayedExpansion 
    if /I not "!FILE!"=="!PREV!" (
     endlocal 
     rem // Reset index if names do not match: 
     set /A "INDEX=0" 
    ) else (
     endlocal 
     rem // Increment index if names do match: 
     set /A "INDEX+=1" 
    ) 
    rem // Build new file nase name: 
    setlocal EnableDelayedExpansion 
    if !INDEX! GTR 0 (
     set "NAME=!NAME!(!INDEX!)" 
    ) 
    rem // Copy file and rename accordingly: 
    > nul copy "!FULL!" "!DESTINATION!\!NAME!!EXT!" 
    endlocal 
    rem // Cache processed file name: 
    set "PREV=%%E" 
) 

rem // Delete temporary file: 
del "%TMPFILE%" 

endlocal 
exit /B 
相關問題