пакетный файл Копирование файлов с определенными расширениями из нескольких каталогов в один каталог - PullRequest
46 голосов
/ 04 августа 2009

Я новичок, так что терпите меня ...

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

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

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

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

Использование xcopy для копирования файлов из нескольких каталогов в один каталог

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

Ответы [ 5 ]

59 голосов
/ 04 августа 2009

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

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, как описано в связанном вопросе выше.

44 голосов
/ 17 октября 2014

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

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

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

6 голосов
/ 04 августа 2009

Именно поэтому я перешел на Powershell. Попробуйте, это весело:

Get-ChildItem -Recurse -Include *.doc | % {
    Copy-Item $_.FullName -destination x:\destination
}
4 голосов
/ 18 августа 2009

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

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 ..)

1 голос
/ 04 августа 2009

Вы также можете использовать 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
...