Copia una lista (txt) di file

Ho visto alcuni esempi di script su SO, ma nessuno di essi sembra fornire esempi su come leggere i nomi di file da un elenco .txt.

Questo esempio è buono, in modo da copiare tutti i file dalla cartella A alla cartella B.

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

Ma ho bisogno di qualcosa come il prossimo, in cui posso effettivamente riempire la cartella di origine e destinazione:

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

E invece di src_folder = c:\whatever\*.* , Quelli *.* Devono essere elenchi di file letti da un file txt.

File-list.txt (esempio)

 file1.pds filex.pbd blah1.xls 

Qualcuno potrebbe suggerirmi come farlo?

Dato il tuo elenco di nomi di file in un file chiamato File-list.txt , le seguenti linee dovrebbero fare ciò che vuoi:

 @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%" ) 

Ho solo provato a usare Frank Bollack e la risposta di Sparrowt, ma senza successo perché includeva un interruttore / U per xcopy. Mi risulta che / U significhi che i file verranno copiati solo se già esistono nella destinazione, cosa che non è stata la mia causa e non sembra essere il caso per l’interrogante originale. Potrebbe aver significato essere stato a / V per verificare, il che avrebbe più senso.

La rimozione dell’interruttore / U ha risolto il problema.

 @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%" ) 

Questo lo farà:

 @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%\" ) 

Quanto segue copia i file da un elenco e preserva la struttura delle directory. Utile quando è necessario comprimere i file che sono stati modificati in un intervallo di commit Git / SVN, ad esempio. Tratterà anche gli spazi nei nomi di directory / file e funzionerà con entrambi i percorsi relativi e assoluti:

 @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 

Nota che se il tuo elenco di file ha percorsi assoluti, devi impostare anche l’ source come percorso assoluto.

(basato su questa domanda: come espandere due variabili locali all’interno di un ciclo for in un file batch )

Ciò manterrà anche la directory del file originale dei file:

 @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" )