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

37

Comment copier un fichier à l'aide de commandes DOS dans une structure de répertoire qui n'existe peut-être pas encore? Je dois pouvoir forcer la création du chemin de 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 sur

C:\example\new\path\to\copy\of\file\file.txt

mais à ce moment

C:\example\

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

En gros, je cherche une commande "Copier et créer le chemin cible si nécessaire". Que recommanderiez-vous est le meilleur moyen d'y parvenir?

nodmonkey
la source
Cette question concerne-t-elle réellement DOS (ou MS-DOS) ou la ligne de commande trouvée dans les versions Windows basées sur NT (2000, XP, Vista, 7, 8, Server)?
Bob
Je parlais de la CLI Windows semblable à DOS. Quelle est la meilleure façon de décrire "CLI Windows semblable à DOS" au titre de l’article?
Nodmonkey
En règle générale, je voudrais utiliser Windows command linedans le titre / corps, avec les balises windows et la ligne de commande (notez que cmd.exe est une balise synonyme de ligne de commande ). La balise ms-dos doit être supprimée. et le tag dos ne doit en aucun cas être utilisé.
Bob
Cependant, dans ce cas, les réponses existantes / acceptées étant pour DOS / MS-DOS, vous pouvez également les laisser telles quelles. Pour référence future, DOS est / doit être interprété comme le (s) système (s) d'exploitation. Bien que la ligne de commande Windows soit basée sur eux, il existe quelques différences notables.
Bob
vous pouvez appeler cela l'invite cmd
barlop

Réponses:

28

Oui, c'est xcopy . Voici à quoi ça va ressembler:

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

Informations XCOPY sur

Vous voudrez peut-être aussi vous intéresser à ROBOCOPY , dans le kit de ressources XP et standard dans Vista, Windows 7 et Server 2008.

robocopy . c:\example\new\path\to\copy\of\file file.txt
bw
la source
3
xcopy convient si vous n'avez pas besoin de renommer également votre fichier. Si vous le faites, xcopy vous demandera malheureusement si la destination est un répertoire ou un nom de fichier et il n’existe aucun commutateur de ligne de commande permettant de spécifier "c’est un fichier".
RomanSt
4
Voir l’autre réponse - utilisez une précédente echo f | avec xcopy pour répondre automatiquement à cette invite.
mcw0933
Notez qu'il devrait y avoir une barre oblique, ``, à la fin du chemin de destination. Sinon, la commande demandera à l'utilisateur si la destination est un répertoire ou un fichier s'il n'existe pas.
Lii
17

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

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

Mais cela me demanderait s'il s'agissait d'un fichier ou d'un répertoire. Puisque 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 de l'utilisateur. J'ai trouvé la solution à mon problème ici:

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

Ce 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 indiqué par @romkyns, des résultats indésirables peuvent apparaître si vous avez des fichiers portant le même nom et quelque chose d'autre (comme 'fichier.txt.bak'). Dans le même fil posté ci-dessus, une autre solution qui fonctionne est le piping "echo f" de votre commande:

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

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

msb
la source
1
Ce qui ne fonctionne que s'il n'y a pas file.txt.bakde répertoire, bien sûr. Néanmoins, cela pourrait fonctionner dans certains scénarios.
RomanSt
@romkyns true. Quelques mois après avoir posté ceci, je me suis retrouvé face au même problème et j'ai fait la solution "echo f", cela fonctionne également très bien. Modification de ma réponse ...
msb
1
Avec echo f | , vous n'avez plus besoin de fuite *.
mcw0933
1
Le deuxième nom de fichier est redondant s'il est identique. "xcopy fichier.txt c: \ exemple \ nouveau \ chemin \ vers \ copie \ de \ fichier \" fonctionnera aussi longtemps que la barre oblique finale dans le répertoire est là (sinon, il demande si un fichier ou un répertoire est voulu) .
FourtyTwo
3

DOS, wow! Quoi qu'il en soit, vous utilisez la commande XCOPY .

Dustin Laine
la source
1
4 ans plus tard DOS, nous l'utilisons toujours même si PowerShell existe ..
Mr AH
0

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

if not exist "NewPath" MkDir "NewPath"
copy "[path\]file.ext" "NewPath[\NewFileName.ext]"

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

if not exist "NewPath" MkDir "NewPath" && copy "[path\]file.ext" "NewPath[\NewFileName.ext]"

La même chose peut être faite avec moveau lieu de copy. Une réponse de StackOverflow m'a appris comment utiliser cette technique move.

NewSites
la source