xcopy-Datei, umbenennen, unterdrücken "Gibt xxx einen Dateinamen an ..."

404

Dies scheint ziemlich einfach zu sein und vielleicht übersehen ich nur das richtige Flag , aber wie würde ich in einem Befehl eine Datei von einem Verzeichnis in ein anderes kopieren und im Zielverzeichnis umbenennen? Hier ist mein Befehl:

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"

Es fordert mich jedes Mal auf, Folgendes zu tun:

Gibt TestConnectionExternal \ bin \ Debug \ whee.config einen Dateinamen oder Verzeichnisnamen auf dem Ziel an (F = Datei, D = Verzeichnis)?

Ich möchte diese Aufforderung unterdrücken. Die Antwort ist immer F.

Sarah Vessels
quelle
15
echo f | xcopy ...
Cyclion
downvote warum benutzt du überhaupt xcopy wenn copy kopiert was du willst
barlop
3
Miscrosoft : "Warum etwas einfach machen, wenn Sie es für Ihre Benutzer wirklich verwirrend machen können?" Dies ist die Zeit, in der sie nur kopieren sollten, was in der Linux-Welt getan wird. cpAchten Sie darauf , dass Sie keine Dateien / Verzeichnisse kopieren müssen!
fduff
Ich empfehle, meine Antwort in der BATCH-Datei zu lesen und nach einer Datei oder einem Ordner zu fragen, in der ausführlich erläutert wird, wann die Eingabeaufforderung angezeigt wird und wie sie von einer Batch-Datei unabhängig vom Betriebssystem automatisch beantwortet werden kann.
Mofi

Antworten:

217

Verwenden Sie nicht die xcopy, verwenden Sie copystattdessen, es hat dieses Problem nicht.

xcopywird im Allgemeinen verwendet, wenn rekursive Kopien mehrerer Dateien / Ordner ausgeführt werden oder wenn Sie die darin enthaltenen Überprüfungs- / Eingabeaufforderungsfunktionen benötigen. Bei Einzeldateikopien copyfunktioniert der Befehl einwandfrei.

LBushkin
quelle
97
copykopiert die Datei nicht, wenn die gesamte Verzeichnisstruktur für das Ziel noch nicht vorhanden ist. xcopyerstellt automatisch alle benötigten Verzeichnisse.
BQ.
41
Es ist erstaunlich, dass xcopy diese Auslassung hat. Wenn es einfach eine Option für Dateien wie für Verzeichnisse (/ I) hätte, wäre dies gelöst und xcopy könnte ein großartiger Ersatz für das Kopieren sein. Stattdessen müssen Sie aufgrund dieses Fehlers eine Kopie für diese Situationen auswählen.
Raketenmonkey
35
Wie andere bereits betont haben, ist die Antwort von @ Arnshea die richtige. Dies liegt daran, dass a) der besondere Umstand des OP, dass die Verzeichnisstruktur bereits vorhanden ist, in der Frage nicht erwähnt wurde, und b) es für zukünftige Leser dieser Frage weitaus wertvoller ist, die hierher kommen und nach einer Antwort suchen xcopyund nicht nur copy.
Mike Nakis
17
Die Antwort von @ Amshea ist auch die richtige, da die Frage spezifisch für xcopy ist und diese Antwort im Grunde "keine xcopy verwenden" lautet. Beantwortet die Frage nach xcopy überhaupt nicht wirklich, oder?
BrainSlugs83
9
Fügen Sie einfach einen Stern am Ende des Pfades für das Ziel hinzu. Schauen Sie sich diese Antwort unten an. stackoverflow.com/a/26034267/1231
Donny V.
638

ich benutze

echo f | xcopy /f /y srcfile destfile

um es zu umgehen.

Shea
quelle
17
@Arnshea - danke! Angepasst für stille Verzeichniskopieecho d | xcopy srcdirectory destdirectory /S
Dr. ABT
8
+1 @Arnshea Ich habe einige Zeit gebraucht, um zu verstehen, was Sie genau dort tun, und da echo d | xcopy ...ich an einer deutschen Windows-Installation arbeite, ist es für mich. Sie sind brillant
Thomas
23
Er simuliert eine Benutzerantwort auf die Frage, die xcopy stellen wird.
John Munsch
5
@Thomas Bedeutet das, dass eine Batchdatei, die diese Technik verwendet, nicht über verschiedene Ländereinstellungen hinweg portierbar ist?
Max Nanasy
17
@MaxNanasy Ich habe bestätigt, dass dies nicht portübergreifend portierbar ist. In einem deutschen Setup übergeben Sie D für eine Datei oder V für ein Verzeichnis. :(
Matt
177

Eine andere Option ist die Verwendung eines Ziel-Platzhalters. Beachten Sie, dass dies nur funktioniert, wenn die Quell- und Zieldateinamen identisch sind. Obwohl dies das spezifische Beispiel des OP nicht löst, dachte ich, dass es sich lohnt, es zu teilen.

Zum Beispiel:

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

erstellt eine Kopie der Datei "whee.config.example" im Zielverzeichnis, ohne zur Eingabe einer Datei oder eines Verzeichnisses aufzufordern.

Update : Wie von @chapluck erwähnt:

Sie können ändern , "* "zu "[newFileName].*". Die Dateierweiterung bleibt bestehen, kann jedoch umbenannt werden. Oder mehr hacky: "[newFileName].[newExt]*"Erweiterung ändern

Zippycoder
quelle
1
Das "Echo f |" Weg ist cool, aber dies vermeidet die zusätzliche Ausgabe, nach der ich oft suche, um überhaupt Probleme zu finden.
Richard Anthony Hein
6
@ Durden81 - wie zippycoder betont, benennt ihre Antwort die Datei nicht um, was eine Anforderung des OP war.
Polyfun
6
Um die Antwort zu erweitern, würde ich "*" in "[newFileName]. *" Ändern. Die Dateierweiterung bleibt bestehen, kann jedoch umbenannt werden. Oder mehr hacky: "[newFileName]. * [NewExt]", um die Erweiterung zu ändern.
Chapluck
Vielen Dank! Der Update-Abschnitt hat mein Problem gelöst, bei dem der Dateiname geändert werden musste, wobei die Erweiterung beibehalten und angenommen wurde, dass es sich um die Datei handelt. XCopy hätte dies als Schalter haben sollen.
Stanislav
1
Arbeitete für mich ohne Sternchen am Ende, nur Backslash.
Tivnet
91

In XCOPY gibt es eine Art undokumentierte Funktion. Sie können verwenden:

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

Ich habe es gerade heute getestet. :-)

ienaxxx
quelle
4
Vielen Dank. Ich habe ein "*" am Ende der Zieldatei hinzugefügt und es hat funktioniert .. :) +1 für den Trick
Rahul Patel
2
Ausgezeichnete Lösung - sauber, elegant, verwendet keinen anderen Befehl, kompatibel mit vorhandenen xcopy-Flags, funktioniert einwandfrei. Dies sollte die am besten gewählte Antwort sein.
Brian Swift
7
Die Antwort ist falsch, der Befehl führt whee.config.examplezum Zielordner, weil whee.config*übereinstimmt whee.config.example.
Miau
2
Ich habe gerade eine Datei erstellt b.txtxtund dann den Befehl gestartet, xcopy a.txt b.txt* /F /Yund die Datei a.txtwurde b.txtwie erwartet kopiert . Darüber hinaus wird bei Verwendung der /F /YSchalter die tatsächliche Kopie genau wie erwartet auf dem Bildschirm angezeigt.
Dominique
1
@Meow: Nein, da sich der Platzhalter im Ziel befindet, nicht in der Quelle.
ienaxxx
74

Gehen Sie einfach zu http://technet.microsoft.com/en-us/library/bb491035.aspx

Das Hauptproblem lautet: "... Wenn das Ziel kein vorhandenes Verzeichnis enthält und nicht mit einem Backslash () endet , wird die folgende Meldung angezeigt: ...

Gibt das Ziel einen Dateinamen oder Verzeichnisnamen auf dem Ziel an (F = Datei, D = Verzeichnis)?

Sie können diese Nachricht unterdrücken, indem Sie die Befehlszeilenoption / i verwenden. Dadurch nimmt xcopy an, dass das Ziel ein Verzeichnis ist, wenn die Quelle mehr als eine Datei oder ein Verzeichnis ist.

Ich habe eine Weile gebraucht, aber alles was es braucht ist RTFM.

Rechnung
quelle
7
Dies sollte die beste Antwort sein! Nur um anderen wirklich klar zu sein. Wenn Sie EINE Datei von einem Ort an einen anderen kopieren UND die vollständige Verzeichnisstruktur erstellen möchten, verwenden Sie den folgenden Befehl: xcopy / "C: \ Data \ Images \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb -67ecff20c96b.jpg C: \ Zieldaten \ Images \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb-67ecff20c96b.jpg \. Ja, setzen Sie einen Backslash am Ende des Dateinamens!
Adudley
4
Gute Antwort, löst aber das Problem nicht. Ich habe xcopy hello.txt hello2 \ ausprobiert. Keine Aufforderung. Jetzt versuche ich xcopy hello.txt hello3 (ohne Backslash). Es fordert mich auf, ob dest file oder dir ist. Ich brauche eine Möglichkeit, es anzuweisen, F oder D in einem Skript anzunehmen.
RuntimeException
27
Dies ist eine sehr seltsame Antwort, insbesondere wegen der positiven Stimmen, des nicht hilfreichen "RTFM" -Snarks und der Kommentare, in denen die "populären" Antworten niedergelegt sind ... da die ursprüngliche Frage nicht angesprochen wird! In der ursprünglichen Frage stand eindeutig "Kopieren Sie eine Datei von einem Verzeichnis in ein anderes und benennen Sie sie im Zielverzeichnis um". Die oben angegebene versuchte Antwort scheint den unterschiedlichen Fall des Kopierens der Datei zu behandeln, wobei der Name der Zieldatei der gleiche Name wie die Quelldatei ist. Die "chaotische" Problemumgehung von @Arnshea ist die einzige Einzelschrittantwort, die ich hier sehe - daher ihre "Popularität".
M. Bearden
3
Herr Bearden war ziemlich höflich, aber angesichts der Anzahl der Stimmen habe ich das Bedürfnis, die Probleme mit dieser Antwort ausdrücklich aufzulisten: 1) der erste Absatz, der eine Lösung für das Problem des OP zu bieten scheint (Absatz 4 von 5), funktioniert nicht , da das OP eine Datei kopiert und umbenennt , kein Verzeichnis; 2) Der oben in der Antwort angegebene Link bietet keine Lösung. 3) Die Erklärung des Hauptthemas gilt nicht für die Frage des OP. und 4) die Antwort ist beleidigend, mit Schreien im 2. Absatz und Beleidigungen im letzten. Vielleicht hätte er die Frage noch einmal lesen sollen.
GlennFromIowa
2
Alle hier gegebenen Antworten sind, in ein Verzeichnis zu kopieren, nicht in ein Dateiziel zu kopieren, was möglich und ohne Papiere ist, siehe die andere Antwort von zippycoder, chapluck, LBushkin
pdem
27

Es gibt also eine einfache Lösung dafür. Es ist zwar umständlich, aber es funktioniert. xcopy fordert Sie nicht auf, herauszufinden, ob das Ziel ein Verzeichnis oder eine Datei ist, wenn die neue Datei (Dateiname) bereits vorhanden ist. Wenn Sie Ihrem xcopy-Befehl ein einfaches Echo auf den neuen Dateinamen voranstellen, wird die leere Datei überschrieben. Beispiel

echo.>newfile.txt
xcopy oldfile.txt newfile.txt /Y
DaveD
quelle
6

Dies ist aus Rechnungen Antwort.

Nur um anderen wirklich klar zu sein.

Wenn Sie EINE Datei von einem Ort an einen anderen kopieren UND die vollständige Verzeichnisstruktur erstellen möchten, verwenden Sie den folgenden Befehl:

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\" 

Ja, setzen Sie einen Backslash am Ende des Dateinamens und Sie werden NICHT gefragt, ob es sich um eine Datei oder ein Verzeichnis handelt. Da die Quelle nur EINE Datei enthält, wird davon ausgegangen, dass es sich um eine Datei handelt.

Adudley
quelle
12
Das ist falsch. Wenn "xcopy versionBase.txt asd \ versionBase.txt \" ausgeführt wird und das Verzeichnis asd nicht vorhanden ist, wird die Datei asd \ versionBase.txt \ versionBase.txt angezeigt.
Cristian Niculescu
1
Wie bei anderen Antworten auf dieser Seite geht dieser Beitrag nicht auf die ursprüngliche Frage ein. Die Frage war, wie man eine Datei kopiert UND (in einem Schritt) umbenennt. Wie bei anderen scheinbar verwirrten Antworten geht es hier darum, wie die Datei OHNE Umbenennung kopiert werden kann.
M. Bearden
Ganz zu schweigen von der Tatsache, dass wirklich ein Verzeichnis mit diesem Namen erstellt wird, kein Ordner. Testen Sie es und führen Sie anschließend ein dir "C:\Target Data\\Images\2013\08\12" 09/25/2015 10:48 AM <DIR> 85e4a707-2672-481b-92fb-67ecff20c96b.jpg
Verzeichnis aus
3

xcopy src dest /I

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

jerryh91
quelle
2

Ich hatte ein ähnliches Problem und sowohl Robocopy als auch xcopy halfen nicht, da ich die Kommentare unterdrücken und einen anderen Zieldateinamen verwenden wollte. ich fand

type filename.txt > destfolder\destfilename.txt

Arbeiten nach meinen Anforderungen.

user140185
quelle
2

Zurück zur ursprünglichen Frage:

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

könnte mit zwei Befehlen erfolgen, zB:

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

Durch einfaches Anhängen von "\ .." an den Pfad der Zieldatei wird das Zielverzeichnis erstellt, sofern es noch nicht vorhanden ist. In diesem Fall

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

Dies ist das übergeordnete Verzeichnis des nicht vorhandenen Verzeichnisses

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

Zumindest für WIN7 ist es mkdir egal, ob das Verzeichnis

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

existiert wirklich.

Grenix
quelle
Ein interessanter Fix, wenn das Verzeichnis nicht existiert. Leider fordert die nächste Zeile (in meinen Tests) den Benutzer immer noch auf.
GlennFromIowa
Sie haben Recht, es sollte xcopy "bin \ development \ whee.config.example" "c: \ mybackup \ TestConnectionExternal \ bin \ Debug \ whee.config \" sein. Ich habe meinen Ansatz verwendet, um Dateien in ein Verzeichnis zu kopieren, das möglicherweise nicht vorhanden ist. Zum Umbenennen muss am Ende ein Backslash hinzugefügt werden.
Grenix
2

XCOPY mit * am Ende des Ziels, um Dateien zu kopieren, unabhängig davon, ob sie im Ziel vorhanden sind oder nicht. XCOPY mit \ am Ende des Ziels, um Ordner und Inhalte zu kopieren, die im Ziel vorhanden sind oder nicht

Alternative

RoboForm SOURCE DEST-DATEI für Dateien RoboForm SOURCE DEST für Ordner

Colin Hay
quelle
1

Ich schlage robocopystatt copyoder vor xcopy. Wird als Befehl oder in der GUI auf Clients oder Servern verwendet. Tolerant gegenüber Netzwerkpausen und Sie können festlegen, dass Dateiattribute beim Kopieren von Kopien nach Dateiattributen ignoriert werden. Oh, und es unterstützt Multi-Core-Maschinen, sodass Dateien viel schneller "parallel" miteinander anstatt nacheinander kopiert werden. robocopyfinden Sie im MS TechNet.

surferdj
quelle
2
Ich benutze die ganze Zeit Robocopy. Bei der Frage dieses Posters funktioniert es jedoch nicht, da es keine Dateien umbenennen kann. Was ich bis heute nicht wusste, ist, dass xcopy einen / z-Schalter hat, der Netzwerkpausen toleriert!
GlennFromIowa
1

Das Richtige, wenn Sie nur eine Datei kopieren und ihren Namen am Zielort ändern möchten, ist:

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

Und es wird gut funktionieren

Danke
quelle
1

Zum Duplizieren großer Dateien ist xopy mit / J-Schalter eine gute Wahl. In diesem Fall leiten Sie einfach ein F für die Datei oder ein D für das Verzeichnis weiter. Sie können Jobs auch in einem Array für zukünftige Referenzen speichern. Zum Beispiel:

$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

Vielen Dank an Chand mit ein paar Änderungen: https://stackoverflow.com/users/3705330/chand

MAZDA
quelle
0

Verwenden Sie beim Kopieren von Dateien "Kopieren" anstelle von "Kopieren".

Beispiel: "bin \ development \ whee.config.example" "TestConnectionExternal \ bin \ Debug \ whee.config" kopieren

Peter
quelle
1
Ich versuche, eine Datei mit einem anderen Namen in denselben Ordner zu kopieren, und xcopy funktioniert nicht. Ich benutze copy /Y source destination, um die Überschreibbestätigung zu übergeben.
SandRock
0

Da Sie den Dateinamen nicht wirklich ändern, können Sie den Dateinamen aus dem Ziel entfernen, und es gibt keine Fragen.

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

Dieser Ansatz funktioniert gut, wenn das Zielverzeichnis garantiert vorhanden ist und wenn die Quelle ebenfalls eine Datei oder ein Verzeichnis sein kann.

Simmo
quelle
1
@downvoters: Warum hätte diese Antwort herabgestimmt werden können? In diesem Zusammenhang ist das DebugVerzeichnis wahrscheinlich garantiert vorhanden.
Jirka Hanika
4
Diese Antwort lautet "da Sie den Dateinamen nicht tatsächlich ändern", während in der ursprünglichen Frage eindeutig "Kopieren einer Datei von einem Verzeichnis in ein anderes UND BENENNEN SIE ES im Zielverzeichnis" angegeben ist. Das scheint also für das Thema irrelevant zu sein.
M. Bearden
0

Umgehen, ReName verwenden ... und einen kryptischen Namen benennen, dann den richtigen Namen umbenennen

C:

CD "C: \ Benutzer \ Öffentlich \ Dokumente \ Meine Websites \ AngelFire ~ Zoe \"

XCopy / D / I / V / Y "C: \ Benutzer \ Öffentlich \ Dokumente \ Meine Websites \ HostGator ~ ZoeBeans \ cop.htm"

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

JollyChollie
quelle
0

Mit xcopy können Sie eine einzelne Datei in einen angegebenen Ordner kopieren, ohne dass Sie einen Zielnamen definieren können. Wenn Sie den Zielnamen benötigen, benennen Sie ihn einfach um, bevor Sie ihn kopieren.

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

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

Chuck Emanuel
quelle
Angenommen, dies würde in einer bestimmten Umgebung funktionieren (dh es wird sicher nie eine whee.config im Quellordner geben), um den OP-Code zu replizieren, sollte er nicht eine Umbenennung in den ursprünglichen Namen enthalten? ren "bin\development\whee.config" whee.config.example
GlennFromIowa
0

Setzen Sie ein Sternchen (*) am Ende des Zielpfads, um den Streit zwischen D und F zu überspringen.

Beispiel:

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

Iqra.
quelle
0

Gibt xxxxxxxxxxxx einen Dateinamen oder Verzeichnisnamen auf dem Ziel an

(F = file, D = directory)? D

if a File : (echo F)
if a Directory (echo D)
Dania al Khalil
quelle
0

Ich habe das gleiche Problem beim Versuch, eine Datei mit neuem Namen zu kopieren, nur dann festgestellt, wenn die Datei nicht im Ziel vorhanden oder vorhanden ist (mit neuem Namen), aber älter ist. Die Lösung besteht darin, *char am Ende des Zieldateinamens hinzuzufügen . Beispiel:

xcopy "C:\src\whee.config.txt" "C:\dest\bee.config.txt*" /D /Y
Ivan Alexandrov
quelle
Es funktioniert wie ein Zauber, danke
E.Big
-2

Sie können nicht angeben, dass es sich immer um eine Datei handelt. Wenn Sie die anderen Funktionen von xcopy nicht benötigen, können Sie sie auch einfach normal verwenden copy.

Gabe
quelle
5
Ein Grund dafür ist copy, dass als interner Befehl ErrorLevel nicht festgelegt wird. Wenn Sie den Pfad einer Batchdatei beeinflussen möchten, wenn ein Kopierfehler auftritt, müssen Sie verwenden XCOPY.
Rossmcm
2
Ein weiterer Grund ist, wenn Sie andere Funktionen von xcopy verwenden möchten, wie / d
Victoria