Copier une liste (txt) de fichiers
j'ai vu quelques exemples de scripts sur SO, mais aucun d'eux ne semble fournir d'exemples de la façon de lire les noms de fichiers à partir d'un .liste txt.
cet exemple est bon, afin de copier tous les fichiers du dossier a au dossier B
xcopy c:olddir*.java c:newdir /D /E /Q /Y
mais j'ai besoin de quelque chose comme le suivant, où je peux remplir réellement le dossier 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 la liste des fichiers Lire à 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?
5 réponses
étant donné votre liste de noms de fichiers dans un fichier appelé File-list.txt
, les lignes suivantes devraient 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%"
)
je viens d'essayer D'utiliser la réponse de Frank Bollack et sparrowt, mais sans succès parce qu'il comprenait un commutateur A /U pour la xcopie. C'est ma compréhension que /U signifie que les fichiers seront copiés uniquement si elles existent déjà dans la destination qui n'était pas le cas pour moi et ne semble pas être le cas pour l'origine interlocuteur. Cela aurait pu vouloir dire que c'était A /V pour verify, ce qui aurait eu plus de sens.
L'interrupteur /U a réglé 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 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 copie les fichiers d'une liste et préserve la structure du répertoire. Utile lorsque vous avez besoin de compresser des fichiers qui ont été modifiés dans une plage de Git/SVN commits, par exemple. Il traitera également des espaces dans les noms de répertoire / fichiers, et fonctionne avec les chemins relatifs et absolus:
@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 a des chemins absolus, vous devez définir source
comme un chemin absolu.
(basé sur cette question: comment étendre deux variables locales à l'intérieur d'une boucle for Dans un fichier de lot )
cela permettra également de conserver les fichiers du répertoire original:
@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"
)