2016-10-04 3 views
1

ディレクトリ全体を通過してすべての.sqlファイルをコピーするようにバッチスクリプトを設定する際に助けが必要でした1つのフォルダに保存します。 FORループでこれを簡単にやり遂げることはできますが、異なるディレクトリにある2つ以上のファイルが同じ名前を持っている場合、私は突っ込んでしまいます。私はカウンタを使用してこれを回避しようとしていますが、個々のファイル名に固有のものにするのが難しいです。これまでツリー内のすべての.sqlファイルを同じ名前のファイルのカウンタを使用して1つのフォルダにコピーするバッチファイル

マイコード:たとえば

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 
    ) 
) 

私が持っている場合:

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

%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(2).sql 
file2.sql 
file2(1).sql 

私は私の答えは、サブルーチンにあるのかもしれませんが、私はかなりその仕事をするためにロジックを把握することはできませんと思いました。どんな助けでも大歓迎です。

+1

の可能性のある重複した[コピーファイルが存在する場合は、別の名前としてファイル](http://stackoverflow.com/questions/13659369/copy-file-as -other-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 
関連する問題