fichier xcopy, renommer, supprimer le message «Est-ce que xxx spécifie un nom de fichier…»

404

Cela semble assez simple et peut-être que je ne fais qu'effleurer l' indicateur approprié , mais comment pourrais-je, dans une commande, copier un fichier d'un répertoire à un autre et le renommer dans le répertoire de destination? Voici ma commande:

if exist "bin\development\whee.config.example"
  if not exist "TestConnectionExternal\bin\Debug\whee.config"
    xcopy "bin\development\whee.config.example"
          "TestConnectionExternal\bin\Debug\whee.config"

Cela m'invite à chaque fois:

TestConnectionExternal \ bin \ Debug \ whee.config spécifie-t-il un nom de fichier ou un nom de répertoire sur la cible (F = fichier, D = répertoire)?

Je veux supprimer cette invite; la réponse est toujours F.

Sarah Vessels
la source
15
écho f | xcopy ...
Cyclion
downvote pourquoi utilisez-vous même xcopy si la copie fait ce que vous voulez
barlop
3
Miscrosoft : "pourquoi faire quelque chose de simple alors que vous pouvez le rendre vraiment déroutant pour vos utilisateurs?". C'est le moment où ils devraient simplement copier ce qui se fait dans le monde Linux, ne cherchez cppas à copier des fichiers / répertoires!
fduff
Je recommande de lire ma réponse sur le fichier BATCH demande un fichier ou un dossier expliquant en détail quand l'invite est affichée et comment il peut être répondu automatiquement par un fichier batch batch language OS.
Mofi

Réponses:

217

N'utilisez pas le xcopy, utilisez à la copyplace, il n'a pas ce problème.

xcopyest généralement utilisé lors de l'exécution de copies récursives de plusieurs fichiers / dossiers, ou lorsque vous avez besoin des fonctionnalités de vérification / invite qu'il offre. Pour les copies d'un seul fichier, la copycommande fonctionne très bien.

LBushkin
la source
97
copyne copiera pas le fichier si la structure complète du répertoire de la destination n'existe pas déjà. xcopycréera automatiquement tous les répertoires nécessaires.
BQ.
41
Il est étonnant que xcopy ait cette omission. S'il avait simplement une option pour les fichiers comme il l'a fait pour les répertoires (/ I), cela serait résolu et xcopy pourrait être un excellent remplacement pour la copie. Au lieu de cela, en raison de ce défaut, vous devez choisir la copie pour ces situations.
rocketmonkeys
35
Comme d'autres l'ont déjà souligné, la réponse de @ Arnshea est la bonne. C'est parce que a) la circonstance particulière du PO d'avoir déjà la structure de répertoire en place n'a pas été mentionnée dans la question, et b) il est beaucoup plus précieux pour les futurs lecteurs de cette question qui viendront ici à la recherche d'une réponse concernant xcopyet pas seulement copy.
Mike Nakis
17
Eh bien @ la réponse d'Amshea est également la bonne parce que la question est spécifique à xcopy, et cette réponse est fondamentalement "ne pas utiliser xcopy". Ne répond pas du tout à la question sur xcopy, maintenant?
BrainSlugs83
9
Ajoutez simplement une étoile à la fin du chemin pour la cible. Regardez cette réponse ci-dessous. stackoverflow.com/a/26034267/1231
Donny V.
638

j'utilise

echo f | xcopy /f /y srcfile destfile

pour le contourner.

Karité
la source
17
@Arnshea - merci! Adapté pour une copie de répertoire silencieuseecho d | xcopy srcdirectory destdirectory /S
Dr. ABT
8
+1 @Arnshea il m'a fallu un certain temps pour comprendre ce que vous faites exactement là-bas et depuis que je travaille sur une installation allemande de windows, c'est echo d | xcopy ...pour moi. Tu es brillant
Thomas
23
Il simule une réponse de l'utilisateur à la question que xcopy va poser.
John Munsch
5
@Thomas Cela signifie-t-il qu'un fichier de commandes qui utilise cette technique ne sera pas portable dans différents environnements locaux?
Max Nanasy
17
@MaxNanasy J'ai confirmé que ce n'est pas portable entre les locales. Dans une configuration allemande, vous passez D pour un fichier ou V pour un répertoire. :(
Matt
177

Une autre option consiste à utiliser un caractère générique de destination. Notez que cela ne fonctionne que si les noms de fichiers source et destination sont les mêmes, donc même si cela ne résout pas l'exemple spécifique de l'OP, je pensais que cela valait la peine d'être partagé.

Par exemple:

xcopy /y "bin\development\whee.config.example" "TestConnectionExternal\bin\Debug\*" 

créera une copie du fichier "whee.config.example" dans le répertoire de destination sans demander de fichier ou de répertoire.

Mise à jour : Comme mentionné par @chapluck:

Vous pouvez changer "* "pour "[newFileName].*". Il persiste l'extension de fichier mais permet de renommer. Ou plus hacky: "[newFileName].[newExt]*"pour changer l'extension

zippycoder
la source
1
L'écho f | est cool, mais cela évite la sortie supplémentaire que je recherche souvent pour trouver des problèmes en premier lieu.
Richard Anthony Hein
6
@ Durden81 - comme le souligne zippycoder, leur réponse ne renomme pas le fichier, ce qui était une exigence de l'OP.
Polyfun
6
Pour étendre la réponse, je changerais "*" en "[newFileName]. *". Il persiste l'extension de fichier mais permet de renommer. Ou plus hacky: "[newFileName]. * [NewExt]" pour changer l'extension.
chapluck
Merci! La section de mise à jour est ce qui a résolu mon problème, où le nom du fichier devait être changé, tout en conservant l'extension et en supposant que c'était le fichier. XCopy aurait dû avoir ceci comme commutateur.
Stanislav
1
A fonctionné pour moi sans l'astérisque à la fin, juste une barre oblique inverse.
tivnet
91

Il existe une sorte de fonctionnalité non documentée dans XCOPY. vous pouvez utiliser:

xcopy "bin \ development \ whee.config.example" "c: \ mybackup \ TestConnectionExternal \ bin \ Debug \ whee.config *"

je l'ai testé juste aujourd'hui. :-)

ienaxxx
la source
4
Merci beaucoup. J'ai ajouté un "*" à la fin du fichier de destination et cela a fonctionné .. :) +1 pour l'astuce
Rahul Patel
2
Excellente solution - propre, élégant, n'utilise pas de commande différente, compatible avec les drapeaux xcopy existants, fonctionne parfaitement. Cela devrait être la réponse la plus votée.
Brian Swift
7
La réponse est incorrecte, la commande entraînera whee.config.examplele dossier de destination, car whee.config*correspond whee.config.example.
Meow
2
Je viens de créer un fichier b.txtxt, puis j'ai lancé la commande xcopy a.txt b.txt* /F /Yet le fichier a.txta été copié b.txtcomme prévu. De plus, lors de l'utilisation des /F /Ycommutateurs, la copie réelle est affichée à l'écran, exactement comme prévu.
Dominique
1
@Meow: non, car le caractère générique est dans la destination, pas dans la source.
ienaxxx
74

Allez simplement sur http://technet.microsoft.com/en-us/library/bb491035.aspx

Voici ce qu'est le PROBLÈME PRINCIPAL "... Si la destination ne contient pas de répertoire existant et ne se termine pas par une barre oblique inverse (), le message suivant apparaît: ...

La destination spécifie-t-elle un nom de fichier ou un nom de répertoire sur la cible (F = fichier, D = répertoire)?

Vous pouvez supprimer ce message en utilisant l'option de ligne de commande / i, ce qui oblige xcopy à supposer que la destination est un répertoire si la source est constituée de plusieurs fichiers ou répertoires.

Ça m'a pris du temps, mais tout ce qu'il faut c'est RTFM.

Facture
la source
7
Cela devrait être la meilleure réponse! Juste pour être vraiment clair pour les autres. Si vous copiez UN fichier d'un endroit à un autre ET que vous souhaitez créer la structure de répertoires complète, utilisez la commande suivante: xcopy / "C: \ Data \ Images \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb -67ecff20c96b.jpg "" C: \ Données cibles \\ Images \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb-67ecff20c96b.jpg \ ". Oui, mettez une barre oblique inversée à la fin du nom de fichier!
adudley
4
Bonne réponse, mais ne résout pas le problème. J'ai essayé xcopy hello.txt hello2 \. Aucune invite. Maintenant j'essaye xcopy hello.txt hello3 (sans barre oblique inverse). Il me demande si dest est un fichier ou un dir. J'ai besoin d'un moyen de lui dire d'assumer F ou D dans un script.
RuntimeException
27
C'est une réponse très étrange, surtout à cause des votes positifs, du snark "RTFM" inutile et des commentaires posant les réponses "populaires" ... car elle ne répond pas à la question d'origine! La question d'origine disait clairement "copier un fichier d'un répertoire à un autre ET LE RENOMMER DANS le répertoire de destination". La tentative de réponse donnée ci-dessus semble résoudre le cas différent de la copie du fichier avec le nom du fichier de destination étant le même nom que le fichier source. La solution de contournement "désordonnée" donnée par @Arnshea est la seule réponse en une seule étape que je vois donnée - d'où sa "popularité".
M.Bearden
3
M. Bearden a été assez poli, mais étant donné le nombre de votes positifs, je ressens le besoin d'énumérer expressément les problèmes avec cette réponse: 1) le 1 paragraphe qui semble donner une solution au problème du PO (paragraphe 4 sur 5), ne fonctionne pas , car l'OP copie et renomme un fichier , pas un répertoire; 2) le lien donné en haut de la réponse ne fournit pas de solution; 3) l'énoncé du problème principal ne s'applique pas à la question du PO; et 4) la réponse est offensive, avec des cris dans le 2ème paragraphe et des insultes dans le dernier. Peut-être aurait-il dû relire la question.
GlennFromIowa
2
Toutes les réponses données ici sont de copier dans un répertoire, pas de copier dans une destination de fichier, ce qui est possible et non documenté, voir l'autre réponse de zippycoder, chapluck, LBushkin
pdem
27

Il existe donc une solution simple à cela. C'est certes maladroit, mais ça marche. xcopy ne vous demandera pas de savoir si la destination est un répertoire ou un fichier SI le nouveau fichier (nom de fichier) existe déjà. Si vous faites précéder votre commande xcopy d'un simple écho au nouveau nom de fichier, il écrasera le fichier vide. Exemple

echo.>newfile.txt
xcopy oldfile.txt newfile.txt /Y
DaveD
la source
6

C'est de la réponse de Bills.

Juste pour être vraiment clair pour les autres.

Si vous copiez UN fichier d'un endroit à un autre ET que vous souhaitez créer la structure de répertoires complète, utilisez la commande suivante:

xcopy "C:\Data\Images\2013\08\12\85e4a707-2672-481b-92fb-67ecff20c96b.jpg" "C:\Target Data\\Images\2013\08\12\85e4a707-2672-481b-92fb-67ecff20c96b.jpg\" 

Oui, mettez une barre oblique inversée à la fin du nom de fichier et il ne vous demandera PAS s'il s'agit d'un fichier ou d'un répertoire. Parce qu'il n'y a qu'UN fichier dans la source, il supposera qu'il s'agit d'un fichier.

adudley
la source
12
C'est faux. Lors de l'exécution de "xcopy versionBase.txt asd \ versionBase.txt \" et que le répertoire asd n'est pas présent, j'obtiens le fichier asd \ versionBase.txt \ versionBase.txt.
Cristian Niculescu
1
Comme pour les autres réponses de cette page, ce message ne répond pas à la question d'origine. La question était de savoir comment copier ET renommer (en une seule étape) un fichier. Comme pour les autres réponses apparemment confuses, cela explique comment copier le fichier SANS renommer.
M.Bearden
Sans parler du fait qu'il crée vraiment un répertoire avec ce nom, pas un dossier. Testez-le et exécutez un dir ensuite, et vous verrez quelque chose comme ceci: dir "C:\Target Data\\Images\2013\08\12" 09/25/2015 10:48 AM <DIR> 85e4a707-2672-481b-92fb-67ecff20c96b.jpg
GlennFromIowa
3

xcopy src dest /I

REM This assumes dest is a folder and will create it, if it doesnt exists

jerryh91
la source
2

J'ai eu un problème similaire et robocopy et xcopy n'ont pas aidé, car je voulais supprimer les commentaires et utiliser un nom de fichier de destination différent. j'ai trouvé

type filename.txt > destfolder\destfilename.txt

travailler selon mes besoins.

user140185
la source
2

Retour à la question d'origine:

 xcopy "bin\development\whee.config.example" "TestConnectionExternal\bin\Debug\whee.config"

pourrait être fait avec deux commandes par exemple:

mkdir "c:\mybackup\TestConnectionExternal\bin\Debug\whee.config\.."
xcopy "bin\development\whee.config.example" "c:\mybackup\TestConnectionExternal\bin\Debug\whee.config\"

En ajoutant simplement "\ .." au chemin du fichier de destination, le répertoire de destination est créé s'il n'existe pas déjà. Dans ce cas

"c:\mybackup\TestConnectionExternal\bin\Debug\"

qui est le répertoire parent du répertoire inexistant

"c:\mybackup\TestConnectionExternal\bin\Debug\whee.config\.."

Au moins pour WIN7 mkdir ne se soucie pas si le répertoire

"c:\mybackup\TestConnectionExternal\bin\Debug\whee.config\"

existe vraiment.

grenix
la source
Un correctif intéressant si le répertoire n'existe pas. Malheureusement, la ligne suivante (dans mes tests) invite toujours l'utilisateur.
GlennFromIowa
Vous avez raison, cela devrait être xcopy "bin \ development \ whee.config.example" "c: \ mybackup \ TestConnectionExternal \ bin \ Debug \ whee.config \". J'ai utilisé mon approche pour copier des fichiers dans un répertoire qui pourrait ne pas exister. Pour renommer, il semble qu'une barre oblique inverse doit être ajoutée à la fin.
grenix
2

XCOPY avec * à la fin de la cible pour copier les fichiers, qu'ils existent ou non dans la destination XCOPY avec \ à la fin de la cible pour copier les dossiers et le contenu, qu'ils existent ou non dans la destination

Alternativement

RoboForm SOURCE DEST FILE pour les fichiers RoboForm SOURCE DEST pour les dossiers

Colin Hay
la source
1

Je suggère à la robocopyplace de copyou xcopy. Utilisé comme commande ou dans l'interface graphique sur les clients ou serveurs. Tolérant aux pauses du réseau et vous pouvez choisir d'ignorer les attributs de fichier lors de la copie des attributs de copie par fichier. Oh, et il prend en charge les machines multi-cœurs afin que les fichiers soient copiés beaucoup plus rapidement en "parallèle" les uns avec les autres plutôt que de manière séquentielle. robocopypeut être trouvé sur MS TechNet.

surferdj
la source
2
J'utilise robocopy tout le temps. Cependant, pour la question de cette affiche, cela ne fonctionnera pas, car il ne peut pas renommer les fichiers. Quelque chose que je ne savais pas avant aujourd'hui, c'est que xcopy a un commutateur / z, qui tolère les pauses réseau!
GlennFromIowa
1

La bonne chose à faire si vous voulez simplement copier un fichier et changer son nom à destination est:

xcopy / f / y "bin \ development \ example.exe" "TestConnectionExternal \ bin \ Debug \ NewName.exe *"

Et ça va bien marcher

Thanos
la source
1

Pour dupliquer des fichiers volumineux, xopy avec le commutateur / J est un bon choix. Dans ce cas, dirigez simplement un F pour fichier ou un D pour répertoire. En outre, vous pouvez enregistrer des travaux dans un tableau pour de futures références. Par exemple:

$MyScriptBlock = {
    Param ($SOURCE, $DESTINATION) 
    'F' | XCOPY $SOURCE $DESTINATION /J/Y 
    #DESTINATION IS FILE, COPY WITHOUT PROMPT IN DIRECT BUFFER MODE
}
JOBS +=START-JOB -SCRIPTBLOCK $MyScriptBlock -ARGUMENTLIST $SOURCE,$DESTIBNATION
$JOBS | WAIT-JOB | REMOVE-JOB

Merci à Chand avec quelques modifications: https://stackoverflow.com/users/3705330/chand

MAZDA
la source
0

Utilisez la copie au lieu de xcopy lors de la copie de fichiers.

par exemple, copiez "bin \ development \ whee.config.example" "TestConnectionExternal \ bin \ Debug \ whee.config"

Peter
la source
1
J'essaie de copier un fichier dans le même dossier avec un nom différent et xcopy ne peut pas fonctionner. J'utilise copy /Y source destinationpour passer la confirmation d'écrasement.
SandRock
0

Comme vous ne changez pas réellement le nom de fichier, vous pouvez retirer le nom de fichier de la destination et il n'y aura pas de questions.

xcopy bin\development\whee.config.example TestConnectionExternal\bin\Debug\  /Y

Cette approche fonctionne bien lorsque le répertoire de destination est garanti d'exister et lorsque la source peut également être un fichier ou un répertoire.

simmo
la source
1
@downvoters: Pourquoi cette réponse aurait pu être déclassée? Dans ce contexte, le Debugrépertoire est probablement garanti d'exister.
Jirka Hanika
4
Cette réponse dit "puisque vous ne changez pas réellement le nom de fichier", alors que la question d'origine disait clairement "copiez un fichier d'un répertoire à un autre ET RENOMMEZ-LE dans le répertoire de destination". Cela semble donc sans rapport avec le sujet.
M.Bearden
0

Contournement, utilisez ReName ... et nommez-le un nom cryptique, puis renommez-le en son nom propre

C:

CD "C: \ Users \ Public \ Documents \ Mes sites Web \ AngelFire ~ Zoe \"

XCopy / D / I / V / Y "C: \ Users \ Public \ Documents \ Mes sites Web \ HostGator ~ ZoeBeans \ cop.htm"

Ren "cop.htm" "christ-our-passover.htm"

JollyChollie
la source
0

xcopy vous permettra de copier un seul fichier dans un dossier spécifié, il ne vous permettra pas de définir un nom de destination. Si vous avez besoin du nom de destination, renommez-le avant de le copier.

ren "bin \ development \ whee.config.example" whee.config

xcopy / R / Y "bin \ development \ whee.config" "TestConnectionExternal \ bin \ Debug \"

Chuck Emanuel
la source
En supposant que cela fonctionnerait dans un environnement particulier (c'est-à-dire qu'il n'y aura certainement pas de whee.config dans le dossier source), pour répliquer le code de l'OP, cela ne devrait-il pas inclure un changement de nom au nom d'origine? ren "bin\development\whee.config" whee.config.example
GlennFromIowa
0

Placez un astérisque (*) à la fin du chemin de destination pour ignorer le différend de D et F.

Exemple:

xcopy "compressedOutput.xml" "../../Execute Scripts / APIAutomation / Libraries / rerunlastfailedbuild.xml *"

Iqra.
la source
0

Est-ce que xxxxxxxxxxxx spécifie un nom de fichier ou un nom de répertoire sur la cible

(F = file, D = directory)? D

if a File : (echo F)
if a Directory (echo D)
Dania al khalil
la source
0

J'ai rencontré le même problème lorsque j'essaie de copier le fichier avec un nouveau nom uniquement si le fichier n'existe pas dans la destination ou existe (avec un nouveau nom), mais est plus ancien. La solution consiste à ajouter un caractère *à la fin du nom du fichier de destination. Exemple:

xcopy "C:\src\whee.config.txt" "C:\dest\bee.config.txt*" /D /Y
Ivan Alexandrov
la source
Cela fonctionne comme un charme, thx
E.Big
-2

Vous ne pouvez pas spécifier qu'il s'agit toujours d'un fichier. Si vous n'avez pas besoin des autres fonctionnalités de xcopy, pourquoi ne pas simplement les utiliser régulièrement copy?

Gabe
la source
5
Une raison est que copy, étant une commande interne, ne définit pas ErrorLevel. Si vous souhaitez pouvoir influencer le chemin d'un fichier de commandes en cas d'erreur de copie, vous devez utiliser XCOPY.
rossmcm
2
Une autre raison est que si vous souhaitez utiliser d'autres fonctionnalités de xcopy, comme / d
Victoria