web-dev-qa-db-ja.com

ファイルのリスト(txt)をコピーする

SOでいくつかのスクリプトの例を見てきましたが、いずれも.txtリストからファイル名を読み取る方法の例を提供していないようです。

この例は、AからBフォルダーにすべてのファイルをコピーするのに適しています

xcopy c:\olddir\*.Java c:\newdir /D /E /Q /Y

しかし、次のようなものが必要です。実際にソースと宛先のフォルダを埋めることができます:

 @echo off
 set src_folder = c:\whatever\*.*
 set dst_folder = c:\foo
 xcopy /S/E/U %src_folder% %dst_folder%

そして、src_folder = c:\whatever\*.*の代わりに、それらの*.*は、txtファイルから読み取られたファイルのリストである必要があります。

File-list.txt(例)

file1.pds
filex.pbd
blah1.xls

誰かが私にそれを行う方法を提案できますか?

26
BoDiE2003

File-list.txtというファイル内のファイル名のリストを指定すると、次の行で必要な処理が行われます。

@echo off
set src_folder=c:\whatever
set dst_folder=c:\target
for /f "tokens=*" %%i in (File-list.txt) DO (
    xcopy /S/E "%src_folder%\%%i" "%dst_folder%"
)
38
Frank Bollack

Frank Bollackとsparrowtの答えを使用しようとしましたが、xcopyの/ Uスイッチが含まれていたため成功しませんでした。/Uは、ファイルがコピー先に既に存在する場合にのみコピーされることを意味しますが、これは私には当てはまらず、元の質問者には当てはまらないようです。これは、検証用の/ Vであったことを意味していた可能性があり、これはより意味があります。

/ Uスイッチを削除すると、問題が修正されました。

@echo off
set src_folder=c:\whatever
set dst_folder=c:\target
for /f "tokens=*" %%i in (File-list.txt) DO (
xcopy /S/E "%src_folder%\%%i" "%dst_folder%"
)
20
Scriptman

これはそれを行います:

@echo off
set src_folder=c:\batch
set dst_folder=c:\batch\destination
set file_list=c:\batch\file_list.txt

if not exist "%dst_folder%" mkdir "%dst_folder%"

for /f "delims=" %%f in (%file_list%) do (
    xcopy "%src_folder%\%%f" "%dst_folder%\"
)
3
indiv

以下はリストからファイルをコピーし、ディレクトリ構造を保持します。たとえば、Git/SVNコミットの範囲で変更されたファイルを圧縮する必要がある場合に便利です¹。また、ディレクトリ/ファイル名のスペースも処理し、相対パスと絶対パスの両方で機能します。

(この質問に基づいて: バッチファイルのforループ内の2つのローカル変数を展開する方法

@echo off

setlocal enabledelayedexpansion

set "source=input dir"
set "target=output dir"

for /f "tokens=* usebackq" %%A in ("file_list.txt") do (
    set "FILE=%%A"
    set "dest_file_full=%target%\!FILE:%source%=!"
    set "dest_file_filename=%%~nxA"
    call set "dest_file_dir=%%dest_file_full:!dest_file_filename!=%%"
    if not exist "!dest_file_dir!" (
        md "!dest_file_dir!"
    )
    set "source_file_full=%source%\!FILE:%source%=!"
    copy "!source_file_full!" "!dest_file_dir!"
)
pause

ファイルリストに絶対パスがある場合は、sourceも絶対パスとして設定する必要があります。


[¹] Gitを使用している場合は、以下を参照してください: Gitでフォルダー構造を持つ変更および追加されたファイルのみをエクスポートする

3
Marc.2377

これにより、ファイルの元のファイルディレクトリも保持されます。

@echo off
set src_folder=c:\whatever
set dst_folder=c:\target
set file_list=C:\file_list.txt

for /f "tokens=*" %%i in (%file_list%) DO (
   echo f | xcopy /E /C /R /Y "%src_folder%\%%i" "%dst_folder%\%%i"
)
0
Norlig