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
誰かが私にそれを行う方法を提案できますか?
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%"
)
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%"
)
これはそれを行います:
@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%\"
)
以下はリストからファイルをコピーし、ディレクトリ構造を保持します。たとえば、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でフォルダー構造を持つ変更および追加されたファイルのみをエクスポートする
これにより、ファイルの元のファイルディレクトリも保持されます。
@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"
)