J'ai vu des exemples de scripts sous SO, mais aucun ne semble fournir des exemples montrant comment lire les noms de fichiers à partir d'une liste.
Cet exemple est bon, afin de copier tous les fichiers du dossier A à B
xcopy c:\olddir\*.Java c:\newdir /D /E /Q /Y
Mais j'ai besoin de quelque chose comme la suivante, où je peux réellement remplir les dossiers source et destination:
@echo off
set src_folder = c:\whatever\*.*
set dst_folder = c:\foo
xcopy /S/E/U %src_folder% %dst_folder%
Et au lieu de src_folder = c:\whatever\*.*
, ces *.*
doivent être une liste de fichiers lus à partir d'un fichier txt.
File-list.txt (exemple)
file1.pds
filex.pbd
blah1.xls
Quelqu'un pourrait-il me suggérer comment le faire?
Étant donné votre liste de noms de fichiers dans un fichier appelé File-list.txt
, les lignes suivantes doivent faire ce que vous voulez:
@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%"
)
J'ai juste essayé d'utiliser la réponse de Frank Bollack et sparrowt, mais sans succès, car elle incluait un commutateur/U pour xcopy. Je crois comprendre que/U signifie que les fichiers ne seront copiés que s'ils existent déjà dans la destination, ce qui n'était pas le cas pour moi et ne semble pas être le cas pour le questionneur d'origine. Cela aurait peut-être signifié avoir été un/V pour vérifier, ce qui aurait plus de sens.
Supprimer le commutateur/U corrige le problème.
@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%"
)
Cela va le faire:
@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%\"
)
Ce qui suit va copier les fichiers d'une liste et préserver la structure de répertoires. Utile lorsque vous devez compresser des fichiers qui ont été modifiés dans une plage de validations Git/SVN¹, par exemple. Il traitera également des espaces dans les noms de répertoire/fichier et fonctionnera avec les chemins relatifs et absolus:
(basé sur cette question: Comment développer deux variables locales dans une boucle for dans un fichier batch )
@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
Notez que si votre liste de fichiers comporte des chemins absolus, vous devez également définir source
comme chemin absolu.
[¹] si vous utilisez Git, voir: Exporter uniquement les fichiers modifiés et ajoutés avec une structure de dossiers dans Git
Cela conservera également le répertoire de fichiers d'origine des fichiers:
@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"
)