2009-08-03 4 views
35

Я новичок, так что медведь со мной ...пакетных файлы Копирование файла с некоторыми расширениями из нескольких каталогов в один каталог

Я пытаюсь скопировать все .doc файлов, которые я рассеянные на протяжении нескольких подкаталогов один основной каталог в другой каталог с использованием командного файла. Мне удалось получить filelist.txt всех файлов (есть сотни) из этих каталогов, которые я хочу, чтобы скопировать с помощью:

"C:\Main directory\sub directory" dir /b /s *.doc > "C:\Main directory\sub directory\filelist.txt"

Какой сценарий будет использовать для XCopy тех, в один каталог? Могу ли я использовать какой-то код, который фактически захватывает эти имена файлов с filelist.txt и xcopies их?

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

Using xcopy to copy files from several directories to one directory

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

+1

Открыть главный каталог в Windows Explorer, поиск * .doc, выберите все (Ctrl + A) и скопируйте/вставьте их в новый каталог ... Я тоже изначально перешел к линии cmd для этого, но решение GUI намного быстрее :) – Alex

+0

Я думаю, вы можете просто искать * .doc и копировать результаты! – aliqandil

ответ

54

В пакетном файле решения

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

код работает как таковой;

для каждого файла for в каталоге c:\source и подкаталоги /R, которые соответствуют шаблон (\*.xml) поместить имя файла в переменной %%f, то для каждого файла do копии файла copy %%f по назначению x:\\destination\\

Просто тестировал здесь на моем компьютере Windows XP и это сработало как удовольствие для меня. Но я набрал его в командной строке, поэтому я использовал единственную версию с именем переменной %f, как описано в связанном вопросе выше.

+1

Как вы могли бы решить проблему, если в имени exe есть пробелы? – Euclid

+1

@Euclid от верхней части головы. Я бы изменил окончательный %% f на «%% f», чтобы защитить пробелы. –

+3

Большое вам спасибо. Как мы это сделаем, сохранив папки, из которых она появилась? Пример: сохранить файлы в именах папок и древовидной структуре. – codeshark

6

Такие вещи, почему я переключился на Powershell. Попробуйте, это весело:

Get-ChildItem -Recurse -Include *.doc | % { 
    Copy-Item $_.FullName -destination x:\destination 
} 
+6

Вы можете просто сделать gci -rec -inc * .doc | cp -dest X: \ Destination', так как 'Copy-Item' принимает вход конвейера. Также вы можете полностью избавиться от 'Get-ChildItem' и просто« Copy-Item -Recurse -Include * .doc -Destination C: \ Destination', так как 'Copy-Item' имеет' -Recurse' и '-Include' также. – Joey

+0

ли это сохранить структуру подпапки? кажется не –

+1

@Joey Первое предложение сработало, второй спросил «* Поставлять значения для следующих параметров: *». Попробовал переместить Recurse, чтобы закончить, затем начал смотреть на «Get-Help Copy-Item -Detailed», а затем решил, что я просто попробую ваше первое предложение. ;) – ruffin

1

вы также можете использовать VBScript

Set objFS = CreateObject("Scripting.FileSystemObject") 
strFolder = "c:\test" 
strDestination = "c:\tmp\" 
Set objFolder = objFS.GetFolder(strFolder) 

Go(objFolder) 

Sub Go(objDIR) 
    If objDIR <> "\System Volume Information" Then 
    For Each eFolder in objDIR.SubFolders  
     Go eFolder 
    Next 
    For Each strFile In objDIR.Files 
     strFileName = strFile.Name 
     strExtension = objFS.GetExtensionName(strFile) 
     If strExtension = "doc" Then 
      objFS.CopyFile strFile , strDestination & strFileName 
     End If 
    Next  
    End If 
End Sub 

сохранить как mycopy.vbs и в командной строке

c:\test> cscript /nologo mycopy.vbs 
4

Брэндон, коротким и сладким. Также гибкий.

set dSource=C:\Main directory\sub directory 
set dTarget=D:\Documents 
set fType=*.doc 
for /f "delims=" %%f in ('dir /a-d /b /s "%dSource%\%fType%"') do (
    copy /V "%%f" "%dTarget%\" 2>nul 
) 

Надеюсь, это поможет.

Я бы добавил несколько проверок после копии (используя «||»), но я не уверен, как «copy/v» реагирует, когда он сталкивается с ошибкой.

вы можете попробовать это:

copy /V "%%f" "%dTarget%\" 2>nul|| echo En error occured copying "%%F".&& exit /b 1 

в качестве копии строки. дайте мне знать, если вы получите что-то из этого (не в состоянии проверить отказ копии atm ..)

33

Просто используйте команду XCOPY с рекурсивной опцией

xcopy c:\*.doc k:\mybackup /sy 

/s сделает "рекурсивный"

+4

Это сделало мой день. Большое спасибо! – degot

+4

Но если файл в подпапке 'c:', то он также копирует подпапку и файл .doc' .... вместо самого файла без подпапки – ron

+0

Сделал мой день тоже. Благодарю. – Govinda