2016-06-30 4 views
1

バッチファイルを使用して、テキストファイルのすべてのファイルを1つのコピー先から別のコピー先にコピーします。ソースの宛先に複数のサブフォルダがあり、ファイル名の各サブフォルダを検索するバッチが必要です。テキストファイルにリストされているファイルをフォルダとそのサブフォルダから新しい場所にコピーするバッチスクリプト

フォルダだけをコピーしたくないので、ファイルだけをコピーしてください。

私は、次のコードを持っていますが、私もあればそう、私が見ることができる「notcopied.txt」ファイルと呼ばれるテキストファイルを書きたい

set src=c:\files\sourcefolder\ 
set dst=c:\files\destinationfolder\ 
set file_list=c:\\files\files.txt 

for /r "%src%" %%i in (%file_list%) do copy "%%i" "%dst%" >notcopied.txt 

それは(%file_listの%)を認識していません必要なファイルがソースフォルダにありませんでした。そのファイルをコピー先のフォルダに書きたいと思います。例えば

files.txt contains 
File1.pdf 
File2.pdf 
File3.pdf 

ソースフォルダが

File1.pdf 
File2.pdf 

が含まれていnotcopied.txtは、任意の洞察力のための

File3.pdf 

感謝が表示されます。

+0

は、あなたが '/ F'ループの必要なテキストファイルから読み込むには、あなたの'のために/ R'ループはありませんファイルシステムにアクセスすることさえありません(ワイルドカードがないので、私はこれを 'for'の設計上の欠陥とみなします)。 'for/F'を使って' files.txt'を調べ、 'dir/B/S'を使って各項目を再帰的に検索し、別のネストされた' for/F'ループでその出力を解析します。ソース内のサブディレクトリにファイルがある場合、そのファイルをコピー先の同じサブディレクトリにコピーするか、コピー先のフラットファイル(サブフォルダなしでファイルのみ)にコピーしますか? – aschipfl

+0

私は新しいフォルダに書き込んで同じサブディレクトリをコピーしないことをお勧めします。 – vonN00B

+0

それで、私が言及したループ構造の中の単純な 'copy'コマンドは、それを行います... – aschipfl

答えて

1

まず、あなたはとてもあなたがループの拡張を使用することができます

SETLOCAL ENABLEEXTENSIONS 

拡張コマンドラインを有効にする必要があります。第二に、あなたが検索されたファイルが後で見つかった場合ので、あなたがチェックすることができ

環境変数の
SETLOCAL ENABLEDELAYEDEXPANSION 

遅れ拡張を有効にする必要があります。ここで

は結果である:

@echo off 
SETLOCAL ENABLEEXTENSIONS 
SETLOCAL ENABLEDELAYEDEXPANSION 

SET src=.\sourcefolder\ 
SET dst=.\destinationfolder\ 
SET file_list=.\files.txt 

FOR /F %%f IN (%file_list%) DO (
    SET found=false 
    FOR /F "usebackq" %%s IN (`where /R %src% %%f`) DO (
     SET found=true 
     echo "%%s => %dst%\%%f" 
     @copy /y "%%s" "%dst%\%%f" 
    ) 
    IF "!found!" == "false" (
     echo %%f is not found! 
    ) 
) 

ENABLEDELAYEDEXPANSIONは、それなしで%found%は常にfalseになり、変数%found%のために、ここで必要とされています。 さらに、実行時に環境を拡張するには、!found!の構文を使用する必要があります。

あなたは

batch.bat > result.log 

のようにそれを呼び出すことができ、その結果はresult.log


UPDATEをファイルに書かれます:ここで変数foundなしbacthのバージョンがあるとからの提案で@aschipfl

@echo off 
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 

SET "src=.\sourcefolder\" 
SET "dst=.\destinationfolder\" 
SET "file_list=.\files.txt" 

FOR /F "usebackq eol=| delims=" %%f IN ("%file_list%") DO (
    rem just searching to find out existense of file 
    WHERE /Q /R "%src%" "%%f" 
    IF "!ERRORLEVEL!" == "0" (
     FOR /F "usebackq eol=| delims=" %%s IN (`WHERE /R "%src%" "%%f" 2^> nul`) DO (
      echo "%%s => %dst%\%%f" 
      @copy /y "%%s" "%dst%\%%f" 
     ) 
    ) ELSE (
     echo %%f is not found! 
    ) 
) 

このバージョンでは、ファイル名にspaceシンボルのファイルを処理できます。
しかし、両方のソリューションには同じ制限があります。sourcefolderには名前にスペースを入れることはできません。何らかの理由でコマンドWHERE /R "%src%" "%%f"が機能しませんが、WHERE /R %src% "%%f"は期待どおりに動作します。


アップデート2:ここresult.logを生成し、バージョン、次のとおりです。

@echo off 
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 

SET "src=.\sourcefolder\" 
SET "dst=.\destinationfolder\" 
SET "file_list=.\files.txt" 
SET "out=.\result.log" 
echo > %out% 

FOR /F "usebackq eol=| delims=" %%f IN ("%file_list%") DO (
    rem just searching to find out existense of file 
    WHERE /Q /R %src% "%%f" 
    IF "!ERRORLEVEL!" == "0" (
     FOR /F "usebackq eol=| delims=" %%s IN (`WHERE /R %src% "%%f"`) DO (
      echo "%%s => %dst%\%%f" >> %out% 
      @copy /y "%%s" "%dst%\%%f" 
     ) 
    ) ELSE (
     echo %%f is not found! >> %out% 
    ) 
) 
+0

コードのためにありがとう!私は自分のコンピュータの周りではないが、できるときにそれを試してみるだろう。どこのファイルを出力するために '> result.log'をそのコードに入れますか? – vonN00B

+0

'result.log'は' batch.bat'のフォルダに自動的に作成されます – spirit

+1

'where'を使うことをお勧めします!とにかく一致しない場合には 'どこで'がエラーを投げるので変数 'found'は必要ではないと思います。 'delims ='(デフォルト区切り文字_space_と_tab_を無効にする)と 'eol = |'(デフォルトのchar。 ';')を 'for/F'ループの両方に使用しないようにする必要があります。 2つの 'setlocal'コマンドを1つにする(両方の引数を指定する)... – aschipfl

関連する問題