web-dev-qa-db-fra.com

fichier de commandes Copier des fichiers avec certaines extensions de plusieurs répertoires dans un répertoire

Je suis un débutant, alors supporte-moi ...

J'essaie de tout copier .doc fichiers que j’ai dispersés dans plusieurs sous-répertoires d’un répertoire principal vers un autre répertoire à l’aide d’un fichier de traitement par lots. J'ai réussi à obtenir un filelist.txt de tous les fichiers (il y en a des centaines) hors de ces répertoires que je veux copier en utilisant:

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

Quel script utiliserais-je pour copier ceux-ci dans un seul répertoire? Puis-je utiliser du code qui récupère ces noms de fichiers de filelist.txt et les xcopie?

Pour référence, j'ai regardé la question ci-dessous car il semblait que cela faisait ce que je voulais faire, mais ça n'a pas fonctionné pour moi.

tilisation de xcopy pour copier des fichiers de plusieurs répertoires dans un répertoire

De plus, j'aimerais vraiment comprendre ce concept, alors veuillez décomposer le code pour que je puisse me dire ce que fait chaque élément, ou au moins inclure un lien qui l'expliquera.

48
Brandon

Dans une solution de fichier batch

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

Le code fonctionne comme tel;

pour chaque fichier for dans le répertoire c:\source et les sous-répertoires /R correspondant au modèle (\*.xml), placez le nom du fichier dans la variable %%f, puis pour chaque fichier do copier le fichier copy %%f vers la destination x:\\destination\\

Je viens juste de le tester ici sur mon ordinateur Windows XP) et cela a fonctionné comme une friandise pour moi. Mais je l'ai tapé dans Invite de commande et j'ai donc utilisé la version de nom de variable unique %f, Comme décrit dans la question liée ci-dessus.

62
Simeon Pilgrim

Il suffit d'utiliser la commande XCOPY avec l'option récursive

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

/ s le rendra "récursif"

45
userJT

Des choses comme celles-ci sont la raison pour laquelle je suis passé à Powershell. Essayez, c'est amusant:

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

Brandon, court et doux. Aussi flexible.

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
)

J'espère que cela t'aides.

J'ajouterais quelques vérifications après la copie (en utilisant '||'), mais je ne suis pas sûr de savoir comment "copy/v" réagit lorsqu'il rencontre une erreur.

vous voudrez peut-être essayer ceci:

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

Comme la ligne de copie. laissez-moi savoir si vous en tirez quelque chose (pas en position de tester une copie d'échec atm ..)

4
Jay

vous pouvez aussi utiliser 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 

enregistrer sous mycopy.vbs et en ligne de commande

c:\test> cscript /nologo mycopy.vbs
1
ghostdog74