59 votes

Comment copier un fichier dans un répertoire sous DOS et créer des répertoires si nécessaire?

Comment puis-je copier un fichier en utilisant des commandes DOS dans une structure de répertoire qui peut ne pas encore exister? Je dois être en mesure de forcer la création du chemin du répertoire vers l'emplacement du fichier cible si cet emplacement n'existe pas déjà.

Par exemple, il y a déjà un fichier.txt à cet emplacement :

C:\file.txt

Et je veux le copier à

C:\exemple\nouveau\chemin\vers\copie\de\fichier\fichier.txt

mais pour le moment

C:\exemple\

et tous les sous-répertoires peuvent ou non encore exister.

Fondamentalement, je recherche une commande "copier et créer le chemin cible si nécessaire". Que recommanderiez-vous comme meilleure façon d'atteindre cela?

1 votes

Est-ce que cette question concerne réellement DOS (ou MS-DOS), ou concerne-t-elle plutôt la ligne de commande trouvée dans les versions de Windows basées sur NT (2000, XP, Vista, 7, 8, Serveur) ?

0 votes

Je voulais dire l'interface en ligne de commande de Windows ressemblant à DOS. Que recommandez-vous comme meilleure façon de décrire "l'interface en ligne de commande de Windows ressemblant à DOS" pour le titre de la publication?

0 votes

En général, j'utiliserais la ligne de commande Windows dans le titre/corps, ainsi que les balises windows et command-line (notez que cmd.exe est un synonyme de balise de command-line). La balise ms-dos devrait être supprimée; et la balise dos ne doit en aucun cas être utilisée.

45voto

b w Points 2634

Oui, c'est xcopy. Voici à quoi cela ressemblera:

xcopy file.txt c:\exemple\nouveau\chemin\à\copier\du\fichier\fichier.txt

Infos sur XCOPY à

Vous voudrez peut-être également regarder ROBOCOPY, dans le Kit de ressources XP et standard dans Vista, Windows 7 et Server 2008.

robocopy . c:\exemple\nouveau\chemin\à\copier\du\fichier fichier.txt

3 votes

Xcopy est très bien si vous n'avez pas besoin de renommer votre fichier. Si vous le faites, malheureusement xcopy vous demandera si la destination est un répertoire ou un nom de fichier et il n'y a pas d'interrupteur en ligne de commande pour spécifier "c'est un fichier".

5 votes

Voir l'autre réponse - utilisez un echo f | précédent avec xcopy pour répondre automatiquement à cette invite.

1 votes

Notez qu'il doit y avoir un caractère barre oblique, ``, à la fin du chemin de destination. Sinon, la commande demandera à l'utilisateur s'il s'agit d'un répertoire ou d'un fichier s'il n'existe pas.

24voto

msb Points 1395

J'ai essayé d'utiliser quelque chose comme :

xcopy file.txt c:\example\new\path\to\copy\of\file\file.txt

Mais il me demandait si c'était un fichier ou un répertoire. Comme j'avais cela dans un fichier batch avec 40000 fichiers, ce serait peu pratique. Cette solution ne résout que partiellement mon problème : elle crée la structure de répertoires, mais elle nécessite une interaction utilisateur. J'ai trouvé la solution à mon problème ici :

https://stackoverflow.com/questions/4283312/batch-file-asks-for-file-or-folder

Qui consiste essentiellement à ajouter un "*" à la fin du fichier de destination :

xcopy file.txt c:\example\new\path\to\copy\of\file\file.txt*

EDIT : comme l'a souligné @romkyns, cela peut avoir des résultats indésirables si vous avez des fichiers qui ont le même nom plus quelque chose d'autre (comme 'file.txt.bak'). Dans le même fil de discussion mentionné ci-dessus, une autre solution qui fonctionne est de rediriger "echo f" vers votre commande :

echo f | xcopy file.txt c:\example\new\path\to\copy\of\file\file.txt

Où vous devriez substituer le "f" par quelle que soit la lettre que votre système utilise pour les fichiers, au cas où vous l'utiliseriez dans une autre langue..

1 votes

Ce qui ne fonctionne que s'il n'y a pas de file.txt.bak dans le répertoire, bien sûr. Cela pourrait quand même fonctionner dans certains scénarios.

0 votes

@romkyns vrai. Quelques mois après avoir posté ceci, je me suis retrouvé confronté au même problème et j'ai utilisé la solution "echo f", ça fonctionne aussi très bien. Modifier ma réponse...

1 votes

Avec echo f | , vous n'avez plus besoin de l'astérisque de fin *.

4voto

NewSites Points 467

Que vous utilisiez copy ou xCopy, afin d'éviter une erreur de copy ou une invite de xCopy, testez l'existence du dossier nécessaire et créez-le si nécessaire :

if not exist "NouveauChemin" MkDir "NouveauChemin"
copy "[chemin\]fichier.ext" "NouveauChemin[\NouveauNomFichier.ext]"

ou combinez les commandes avec && sur une ligne de commande :

if not exist "NouveauChemin" MkDir "NouveauChemin" && copy "[chemin\]fichier.ext" "NouveauChemin[\NouveauNomFichier.ext]"

La même chose peut être faite avec move au lieu de copy. J'ai appris cette technique d'une réponse StackOverflow sur comment le faire avec move.

3voto

Dustin Laine Points 223

DOS, wow! De toute façon, vous utilisez la commande XCOPY.

1 votes

4 ans plus tard : oui. DOS nous l'utilisons toujours même si PowerShell existe..

0 votes

C'est 2021. Nous avons PowerShell 7, une toute nouvelle application Terminal, WSL2 - et nous utilisons toujours xcopy pour faire des choses.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X