Пакет: копирование файлов из txt файла в одну папку

Я пытаюсь создать пакетный файл для копирования нескольких файлов, перечисленных в текстовом файле, в новую папку. Я нашел несколько тем, связанных с этим, но я все еще не могу заставить пакет работать должным образом. Проблема, с которой я сталкиваюсь, заключается в том, что файлы, перечисленные в txt, находятся в разных исходных местах и ​​имеют разные расширения. Список гласит, например:

C:\Users\Foo\Pictures\Photographs\September\P1030944.jpg
C:\Users\Foo\Videos\Art\Movies\Class\movie.avi
C:\Users\Foo\Music\Jazz \20051.mp3
...и т.д.

Все команды копирования, которые я смог найти, должны указать либо исходный каталог, т.е.

set src_folder=c:\whatever\
set dst_folder=c:\foo
for /f %%i in (File-list.txt) DO xcopy /S/E/U "%src_folder%\%%i" "%dst_folder%"

или расширение, т.е.

for /R c:\source %f in (*.xml) do copy "%f" x:\destination\

но мне это нужно, чтобы собрать эту информацию из самого списка.
Если это поможет, я знаю, что в txt есть только файлы с 39 возможными различными конкретными расширениями (*.jpg *.gif *.png ... * .xhtml *.xht)

Любая помощь/идеи?


person user1189644    schedule 04.02.2012    source источник
comment
возможный дубликат пакетного файла для копирования файлов из одного папку в другую папку   -  person Eitan T    schedule 12.07.2012


Ответы (3)


Начните читать HELP FOR, а затем попробуйте выполнить следующее в командной строке.

FOR /F %a in (input.txt) DO @ECHO COPY %a c:\newfolder\%~nxa

вы можете видеть, что %a расширяется до фактической строки во входном файле, а %~nxa — это способ извлечь имя и расширение из файла.

После тщательного тестирования переместите команду в свой BAT-файл, замените %a на %%a и удалите команду ECHO.

@echo off
SET destfolder=c:\newfolder 
FOR /F "delims=" %%a IN (input.txt) DO COPY "%%a" "%destfolder%\%%~nxa"

обратите внимание на заключение имен в кавычки "; и включение опции "delims="; оба необходимы в случае, если имена файлов содержат пробелы.

Наконец, будьте осторожны с возможными дубликатами имен в папке назначения. Если это возможно, вам нужно найти стратегию, чтобы справиться с такими столкновениями. Но это может быть предметом другого вопроса SO, не так ли?

person PA.    schedule 04.02.2012
comment
он не будет работать с записями, содержащими пробелы (но я бы оставил это как задачу для OP - если следовать вашему первому пункту, это не должно быть слишком сложно решить :-) - person wmz; 04.02.2012
comment
Круто, спасибо ПА! это работает отлично, пришлось немного подправить, но оно делает именно то, что мне нужно. Думаю, мне не хватало знаний о модификаторах n и x, которые вы объяснили выше. Еще раз спасибо! - person user1189644; 04.02.2012
comment
@wmz вы правы, завтра я отредактирую свой ответ с решением для случая, когда имена файлов в input.txt содержат пробелы - person PA.; 05.02.2012
comment
да, я заметил, что это не будет работать с пробелами, я просто добавил разделители пробелов: FOR /F delims= %%a IN (%CD%\archive.txt) DO COPY %%a %destfolder%\%%~nxa - person user1189644; 05.02.2012
comment
Я отредактировал ответ, включив параметр delims=, чтобы полностью решить проблему имен файлов с пробелами. - person PA.; 05.02.2012

Один образец, который работал для меня...

Замените мои каталоги C:\whatever и C:\temp\svn на ваши...

предполагая, что ваш список файлов называется antidump_list.txt и находится в папке C:\temp\svn\

> set src_folder=C:\whatever
> set dst_folder=C:\temp\svn
> for /f %%i in (C:\temp\svn\antidump_list.txt) DO copy "%src_folder%\%%i" "%dst_folder%\%%i"

С уважением,

Готфрид

person Gottfried    schedule 05.03.2014

Я обнаружил, что самый простой способ сделать это — использовать скрипт powershell.

$Files = Get-Content File-list.txt
$Dest = "C:\output"

foreach ($File in $Files) {
  Copy-Item $File $Dest
}

Если вам нужно запустить его из пакетного файла, вставьте приведенный выше скрипт в файл с именем CopyFiles.ps1 и добавьте следующую команду в свой пакетный файл.

powershell -executionpolicy bypass -file .\CopyFiles.ps1

Поскольку powershell включен по умолчанию в Windows 7 и новее, этот метод так же прост, как делать то же самое только с пакетными командами.

person geoji    schedule 06.01.2016
comment
он копирует весь файл в ту же папку, а не в каталог src - person gladiator; 14.11.2016
comment
Этого хочет ОП. Смотрите первую строку вопроса. Он просто пытается скопировать файлы в a new folder - person geoji; 14.11.2016