web-dev-qa-db-fra.com

batch/bat pour copier le dossier et le contenu à la fois

J'écris un script batch qui fait une copie. Je veux le script pour copier un dossier entier. Quand je veux copier un seul fichier, je le fais 

copy %~dp0file.txt file.txt 

Si j'ai un dossier avec cette structure, existe-t-il une commande pour copier tout ce dossier avec son contenu en une seule fois tout en préservant la structure exacte.

mainfolder/
  file1.txt
  file2.txt
  insidefolder/
     file3.txt
     file4.txt 
     file5.txt
28
zmol

si vous avez xcopy, vous pouvez utiliser le paramètre /E, qui copiera les répertoires et les sous-répertoires et les fichiers qu’ils contiennent, notamment en maintenant la structure de répertoires pour les répertoires vides.

xcopy [source] [destination] /E
46
akf

L'ancienne manière:

xcopy [source] [destination] /E

xcopy est obsolète. Robocopy remplace Xcopy. Il est livré avec Windows 8, 8.1 et 10.

robocopy [source] [destination] /E

robocopy présente plusieurs avantages:

  • copier les chemins dépassant 259 caractères
  • copie multithread

Plus de détails ici .

7
Vertexwahn

Je soupçonne que la commande xcopy est la solution miracle que vous recherchez.

Il peut copier des fichiers, des répertoires et même des lecteurs entiers tout en préservant la hiérarchie de répertoires d'origine. Il existe également une poignée d'options supplémentaires disponibles, par rapport à la commande de base copy.

Découvrez la documentation ici

Si votre fichier de commandes doit uniquement s'exécuter sur Windows Vista ou version ultérieure, vous pouvez utiliser robocopy , outil encore plus puissant que xcopy et intégré au système d'exploitation. Sa documentation est disponible ici .

5
Cody Gray

J'ai été intéressé par la question originale Ici et les questions connexes.

Pour réponse, cette semaine, j’ai fait quelques expériences avec XCOPY.

Pour aider à répondre à la question initiale, voici Je publie les résultats de mes expériences.

J'ai fait les expériences sur Windows 7 64 bits Professional SP1 avec la copie de XCOPY Fournie avec le système d'exploitation.

Pour les expériences, j’ai écrit du code dans Le langage de script Open Object Rexx Et le langage de macro d’éditeur Kexx avec L’éditeur de texte KEdit.

XCOPY a été appelé à partir du code Rexx. Le code Kexx a modifié la sortie d'écran de XCOPY pour se concentrer sur les résultats cruciaux.

Les expériences concernaient toutes l’utilisation de XCOPY pour copier un répertoire avec plusieurs fichiers et sous-répertoires

Les expériences consistaient en 10 cas . Chaque cas ajustait les arguments à XCOPY .__ et appelait XCOPY une fois. Les 10 cas ont tous été tentés par une tentative de copie identique

Voici les principaux résultats:

(1) Sur les 10 cas, seuls trois ont été copiés. Les 7 autres cas immédiatement, juste le traitement des arguments en XCOPY, ont donné des messages d'erreur, par exemple,

Invalid path

Access denied

sans fichiers copiés.

Sur les trois cas de copie, ils ont tous fait la même chose, c’est-à-dire qu’ils ont donné les mêmes résultats.

(2) Si vous souhaitez copier un répertoire X et tous les fichiers Des fichiers et des répertoires du répertoire X, .__ dans l'arborescence hiérarchique du système de fichiers .__, enracinés dans le répertoire X, alors, apparemment, XCOPY - et ce semble être une grande partie de la question initiale - ne fera tout simplement pas cela.

Une conséquence est que si vous utilisez XCOPY pour copier le répertoire X et son contenu, alors PEUT copier le contenu mais NE PEUT PAS copier ledirectory X lui-même; perdez ainsi le tampon time-date sur le répertoire X, son bit archive, les données de propriété, les attributs , etc.

Bien sûr, si le répertoire X est un sous-répertoire Du répertoire Y, un XCOPIE de Y copiera Tout le contenu du répertoire Y WITHdirectory X. Ainsi, cette copie peut obtenir une copie .__ de. répertoire X. Cependant, la copie du.__ répertoire X aura son horodatage de l'heure d'exécution de XCOPY et NON, le timbre heure-date de l'originaldirectoire X.

Ce changement d'horodatage peut être Difficile pour une copie d'un répertoire avec Beaucoup de pages Web téléchargées: Le fichier HTML De la page Web aura son Original heure-date stamp, mais le sous-répertoire correspondant aux fichiers utilisésby le fichier HTML aura la date-heure stamp de l'exécution de XCOPY. Ainsi, lorsque Trie la copie sur l’horodatage, tous Les sous-répertoires, les fichiers HTML et les sous-répertoires correspondants, par exemple,

x.htm

x_files

peuvent apparaître très éloignés dans le tri le heure-date.

Les systèmes de fichiers hiérarchiques remontent à IIRC to Multics à MIT en 1969, et depuis Alors beaucoup de personnes ont reconnu les deux cas , Dans un répertoire X, (i) copiedirectory X et tout son contenu et (ii) copier tout le contenu de X mais pasdirectory X lui-même. Eh bien, ne serait-ce que grâce aux expériences, XCOPY ne fait que (ii).

Ainsi, les résultats des 10 observations sont inférieurs à . Pour chaque observation, dans les résultats, les trois premières lignes contiennent les trois premiers argumentsà XCOPY. Ainsi, la première ligne contient l’arborescencenom du répertoire à copier, le 'Source'; la deuxième ligne a l'arborescencenom du répertoire pour obtenir les copies, la 'destination', et la troisième ligne a les options pour XCOPY. Les lignes 1-2 restantes ont les résultats de l'exécution de XCOPY.

Un point important sur les options est que Options/X et/O résultent en résultat

Access denied

Pour voir cela, comparez le cas 8 avec les autres cas Qui étaient identiques, n’avaient pas /X et/O, mais ils copiaient.

Ces expériences m'ont permis de mieux comprendre XCOPY et d'apporter une réponse à la question initiale.

======= case 1 ==================
"k:\software\dir_time-date\"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_1\"
options = /E /F /G /H /K /O /R /V /X /Y
Result:  Invalid path
Result:  0 File(s) copied
======= case 2 ==================
"k:\software\dir_time-date\*"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_2\"
options = /E /F /G /H /K /O /R /V /X /Y
Result:  Access denied
Result:  0 File(s) copied
======= case 3 ==================
"k:\software\dir_time-date"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_3\"
options = /E /F /G /H /K /O /R /V /X /Y
Result:  Access denied
Result:  0 File(s) copied
======= case 4 ==================
"k:\software\dir_time-date\"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_4\"
options = /E /F /G /H /K /R /V /Y
Result:  Invalid path
Result:  0 File(s) copied
======= case 5 ==================
"k:\software\dir_time-date\"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_5\"
options = /E /F /G /H /K /O /R /S /X /Y
Result:  Invalid path
Result:  0 File(s) copied
======= case 6 ==================
"k:\software\dir_time-date"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_6\"
options = /E /F /G /H /I /K /O /R /S /X /Y
Result:  Access denied
Result:  0 File(s) copied
======= case 7 ==================
"k:\software\dir_time-date"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_7"
options = /E /F /G /H /I /K /R /S /Y
Result:  20 File(s) copied
======= case 8 ==================
"k:\software\dir_time-date"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_8"
options = /E /F /G /H /I /K /O /R /S /X /Y
Result:  Access denied
Result:  0 File(s) copied
======= case 9 ==================
"k:\software\dir_time-date"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_9"
options = /I /S
Result:  20 File(s) copied
======= case 10 ==================
"k:\software\dir_time-date"
"k:\software\xcopy002_test\xcopy002_test_dirs\output_sub_dir_10"
options = /E /I /S
Result:  20 File(s) copied
0
a_programmer

Pour la copie de dossier, vous pouvez utiliser

robocopy C:\Source D:\Destination /E

Pour la copie de fichier

copy D:\Sourcefile.txt D:\backup\Destinationfile.txt /Y 

Supprimer le fichier dans certains dossiers date de dernière modification plus d'un jour

forfiles -p "D:\FolderPath" -s -m *.[Filetype eg-->.txt] -d -[Numberof dates] -c "cmd /c del @PATH"

Et vous pouvez Shedule tâche dans Windows effectuer cette tâche automatiquement dans un délai précis.