file xcopy, rinominare, sopprimere il messaggio "Il xxx specifica un nome di file ..."


404

Questo sembra piuttosto semplice e forse sto solo trascurando la bandiera corretta , ma come potrei, in un comando, copiare un file da una directory a un'altra e rinominarlo nella directory di destinazione? Ecco il mio comando:

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"

Mi viene sempre richiesto quanto segue:

TestConnectionExternal \ bin \ Debug \ whee.config specifica un nome file o un nome directory sulla destinazione (F = file, D = directory)?

Voglio sopprimere questo messaggio; la risposta è sempre F.


15
echo f | xcopy ...
Cyclion il

downvote perché usi anche xcopy se copy fa quello che vuoi
barlop

3
Miscrosoft : "perché rendere qualcosa di semplice quando puoi renderlo davvero confuso per i tuoi utenti?". Questo è il momento in cui dovrebbero semplicemente copiare ciò che è stato fatto nel mondo Linux, non cercare cpb ** t per copiare file / directory!
fduff,


Consiglio di leggere la mia risposta sul file BATCH per chiedere file o cartelle che spieghino in dettaglio quando viene visualizzato il prompt e come può essere risposto automaticamente da un file batch OS indipendente dalla lingua.
Mofi

Risposte:


217

Non usare xcopy, usa copyinvece, non ha questo problema.

xcopyviene generalmente utilizzato quando si eseguono copie ricorsive di più file / cartelle o quando sono necessarie le funzionalità di verifica / richiesta che offre. Per le copie di un singolo file, il copycomando funziona perfettamente.


97
copynon copierà il file se l'intera struttura di directory per la destinazione non esiste già. xcopycreerà automaticamente tutte le directory necessarie.
BQ.

41
È sorprendente che xcopy abbia questa omissione. Se avesse semplicemente un'opzione per file come ha fatto per le directory (/ I), questo sarebbe risolto e xcopy potrebbe essere un ottimo sostituto per la copia. Invece, a causa di questo difetto, devi scegliere la copia per queste situazioni.
rocketmonkeys,

35
Come altri hanno già sottolineato, la risposta di @ Arnshea è quella corretta. Questo perché a) la particolare circostanza del PO di disporre già della struttura di directory non è stata menzionata nella domanda eb) è molto più utile per i futuri lettori di questa domanda che verranno qui alla ricerca di una risposta in merito xcopye non solo copy.
Mike Nakis,

17
Beh, la risposta di Amshea è anche quella corretta perché la domanda è specifica per xcopy, e questa risposta è sostanzialmente "non usare xcopy". Non risponde affatto alla domanda su xcopy, ora lo fa?
BrainSlugs83,

9
Aggiungi una stella alla fine del percorso per il bersaglio. Guarda questa risposta qui sotto. stackoverflow.com/a/26034267/1231
Donny V.

638

Io uso

echo f | xcopy /f /y srcfile destfile

per aggirarlo.


17
@Arnshea - grazie! Adattato per la copia della directory silenziosaecho d | xcopy srcdirectory destdirectory /S
Dr. ABT

8
+1 @Arnshea mi ci è voluto un po 'di tempo per capire cosa stai facendo esattamente lì e dato che sto lavorando su un'installazione tedesca di Windows è echo d | xcopy ...per me. Sei brillante
Thomas,

23
Sta simulando una risposta dell'utente alla domanda che XCAPY farà.
John Munsch,

5
@Thomas Ciò implica che un file batch che utilizza questa tecnica non sarà trasferibile in diverse lingue?
Max Nanasy,

17
@MaxNanasy Ho confermato che questo non è portatile in tutte le versioni locali. In una configurazione tedesca, si passa in D per un file o V per una directory. :(
Matt,

177

Un'altra opzione è utilizzare un carattere jolly di destinazione. Si noti che questo funziona solo se i nomi dei file di origine e destinazione saranno gli stessi, quindi anche se questo non risolve l'esempio specifico dell'OP, ho pensato che valesse la pena condividerlo.

Per esempio:

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

creerà una copia del file "whee.config.example" nella directory di destinazione senza richiedere file o directory.

Aggiornamento : come menzionato da @chapluck:

Puoi cambiare "* "in "[newFileName].*". Persiste l'estensione del file ma consente di rinominarlo. O più hacky: "[newFileName].[newExt]*"per cambiare l'estensione


1
"Echo f |" è bello, ma questo evita l'output extra che spesso cerco di trovare problemi in primo luogo.
Richard Anthony Hein,

6
@ Durden81 - come sottolinea zippycoder, la loro risposta non rinomina il file, che era un requisito dell'OP.
Polyfun,

6
Per estendere la risposta, cambierei "*" in "[newFileName]. *". Persiste l'estensione del file ma consente di rinominarlo. O più hacky: "[newFileName]. * [NewExt]" per modificare l'estensione.
Chapluck,

Grazie! La sezione di aggiornamento è ciò che ha risolto il mio problema, in cui il nome del file doveva essere modificato, mantenendo l'estensione e supponendo che fosse il file. XCopy avrebbe dovuto avere questo come interruttore.
Stanislav,

1
Ha funzionato per me senza l'asterisco alla fine, solo una barra rovesciata.
tivnet,

91

C'è una sorta di funzionalità non documentata in XCOPY. Puoi usare:

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

l'ho provato solo oggi. :-)


4
Molte grazie. Ho aggiunto un "*" alla fine del file di destinazione e ha funzionato .. :) +1 per il trucco
Rahul Patel

2
Soluzione eccellente: pulita, elegante, non utilizza un comando diverso, compatibile con le bandiere xcopy esistenti, funziona perfettamente. Questa dovrebbe essere la risposta più votata.
Brian Swift,

7
La risposta non è corretta, il comando comporterà whee.config.examplela cartella di destinazione, perché whee.config*corrisponde whee.config.example.
Meow,

2
Ho appena creato un file b.txtxt, quindi ho avviato il comando xcopy a.txt b.txt* /F /Ye il file a.txtè stato copiato b.txt, come previsto. Inoltre, mentre si utilizzano gli /F /Yinterruttori, la copia effettiva viene visualizzata sullo schermo, esattamente come previsto.
Dominique,

1
@Meow: no, poiché il carattere jolly si trova nella destinazione, non nella fonte.
ienaxxx,

74

Vai su http://technet.microsoft.com/en-us/library/bb491035.aspx

Ecco cosa è il PROBLEMA PRINCIPALE "... Se Destination non contiene una directory esistente e non termina con una barra rovesciata (), viene visualizzato il seguente messaggio: ...

La destinazione specifica un nome file o un nome directory sulla destinazione (F = file, D = directory)?

È possibile sopprimere questo messaggio utilizzando l'opzione della riga di comando / i, che fa supporre che xcopy supponga che la destinazione sia una directory se l'origine è più di un file o una directory.

Mi ci è voluto un po ', ma basta RTFM.


7
Questa dovrebbe essere la risposta migliore! Giusto per essere veramente chiari per gli altri. Se si sta copiando UN file da un posto all'altro E si desidera creare la struttura di directory completa, utilizzare il comando seguente: 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 \ ". Sì, metti una barra rovesciata alla fine del nome del file!
adudley,

4
Buona risposta, ma non risolve il problema. Ho provato xcopy hello.txt hello2 \. Nessun prompt. Ora provo xcopy hello.txt hello3 (senza barra rovesciata). Mi viene chiesto se dest è file o dir. Ho bisogno di un modo per dirlo per assumere F o D in una sceneggiatura.
RuntimeException il

27
Questa è una risposta molto strana, soprattutto a causa dei voti positivi, dello scontroso "RTFM" snark e dei commenti che mettono le risposte "popolari" ... dal momento che non affronta la domanda originale! La domanda originale diceva chiaramente "copiare un file da una directory all'altra E RINOMINARLO nella directory di destinazione". La tentata risposta fornita in precedenza sembra risolvere il diverso caso di copia del file con il nome del file di destinazione come SAME come file di origine. La soluzione "disordinata" fornita da @Arnshea è l'unica risposta in un solo passaggio che vedo qui, quindi la sua "popolarità".
M.Bearden,

3
Bearden è stato abbastanza gentile, ma dato il numero di voti positivi, sento la necessità di elencare espressamente i problemi con questa risposta: 1) il paragrafo 1 che sembra fornire una soluzione al problema del PO (paragrafo 4 di 5), non non funziona, perché l'OP è copiare e rinominare un file di , non una directory; 2) il link indicato nella parte superiore della risposta non fornisce una soluzione; 3) l'affermazione della questione principale non si applica alla domanda del PO; e 4) la risposta è offensiva, con urla nel secondo paragrafo e insulti nell'ultimo. Forse avrebbe dovuto rileggere la domanda.
GlennFromIowa

2
Tutte le risposte fornite qui sono da copiare in una directory, non da copiare in una destinazione di file, che è possibile e non documentata, vedere l'altra risposta da zippycoder, chapluck, LBushkin
pdem

27

Quindi, c'è una soluzione semplice per questo. È certamente imbarazzante, ma funziona. xcopy non richiederà di scoprire se la destinazione è una directory o un file SE il nuovo file (nome file) esiste già. Se si precede il comando xcopy con una semplice eco al nuovo nome file, sovrascriverà il file vuoto. Esempio

echo.>newfile.txt
xcopy oldfile.txt newfile.txt /Y

6

Questo è dalla risposta di fatture.

Giusto per essere veramente chiari per gli altri.

Se stai copiando UN file da una posizione a un'altra E vuoi creare la struttura di directory completa, usa il seguente comando:

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

Sì, inserisci una barra rovesciata alla fine del nome del file e NON ti chiederà se si tratta di un file o di una directory. Poiché esiste un solo file nell'origine, supporrà che sia un file.


12
Questo è sbagliato. Quando eseguo "xcopy versionBase.txt asd \ versionBase.txt \" e la directory asd non è presente, ottengo il file asd \ versionBase.txt \ versionBase.txt.
Cristian Niculescu,

1
Come con altre risposte su questa pagina, questo post non affronta la domanda originale. La domanda era come copiare E rinominare (in un solo passaggio) un file. Come con altre risposte apparentemente confuse, si parla di come copiare il file SENZA rinominare.
M.Bearden,

Per non parlare del fatto che crea davvero una directory con quel nome, non una cartella. dir "C:\Target Data\\Images\2013\08\12" 09/25/2015 10:48 AM <DIR> 85e4a707-2672-481b-92fb-67ecff20c96b.jpg
Provalo

3

xcopy src dest /I

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


2

Ho avuto un problema simile e sia robocopy che xcopy non mi hanno aiutato, poiché volevo sopprimere i commenti e utilizzare un nome file di destinazione diverso. ho trovato

type filename.txt > destfolder\destfilename.txt

lavorando secondo i miei requisiti.


2

Torna alla domanda originale:

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

potrebbe essere eseguito con due comandi, ad esempio:

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

Aggiungendo semplicemente "\ .." al percorso del file di destinazione, la directory di destinazione viene creata se non esiste già. In questo caso

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

che è la directory principale della directory inesistente

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

Almeno per WIN7 a mkdir non importa se la directory

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

esiste davvero.


Una soluzione interessante se la directory non esiste. Sfortunatamente, la riga successiva (nei miei test) richiede ancora all'utente.
GlennFromIowa,

Hai ragione, dovrebbe essere xcopy "bin \ development \ whee.config.example" "c: \ mybackup \ TestConnectionExternal \ bin \ Debug \ whee.config \". Ho usato il mio approccio per copiare i file in una directory che potrebbe non esistere. Per rinominare sembra che una barra rovesciata debba essere aggiunta alla fine.
grenix,

2

XCOPY con * alla fine della destinazione per copiare i file che esistano o meno nella destinazione XCOPY con \ alla fine della destinazione per copiare le cartelle e i contenuti che esistono o meno nella destinazione

In alternativa

RoboForm SOURCE DEST FILE per i file RoboForm SOURCE DEST per le cartelle


1

Suggerisco robocopyinvece di copyo xcopy. Utilizzato come comando o nella GUI su client o server. Tollerante delle pause di rete e puoi scegliere di ignorare gli attributi del file quando copi la copia dagli attributi del file. Oh, e supporta macchine multi-core, quindi i file vengono copiati molto più velocemente in "parallelo" tra loro anziché in sequenza. robocopypuò essere trovato su MS TechNet.


2
Uso sempre robocopy. Tuttavia, per la domanda di questo poster, non funzionerà perché non può rinominare i file. Qualcosa che non sapevo prima oggi è che xcopy abbia uno switch / z, che è tollerante alle pause della rete!
GlennFromIowa,

1

La cosa giusta da fare se si desidera copiare solo il file e modificarne il nome a destinazione è:

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

E funzionerà bene


1

Per duplicare file di grandi dimensioni, xopy con l'opzione / J è una buona scelta. In questo caso, è sufficiente reindirizzare una F per il file o una D per la directory. Inoltre, è possibile salvare i lavori in un array per riferimenti futuri. Per esempio:

$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

Grazie a Chand con alcune modifiche: https://stackoverflow.com/users/3705330/chand


0

Usa copia invece di xcopy durante la copia dei file.

ad es. copia "bin \ development \ whee.config.example" "TestConnectionExternal \ bin \ Debug \ whee.config"


1
Sto cercando di copiare un file nella stessa cartella con un nome diverso e xcopy non può funzionare. Uso copy /Y source destinationper passare la conferma di sovrascrittura.
SandRock,

0

Dal momento che in realtà non stai modificando il nome file, puoi estrarre il nome file dalla destinazione e non ci saranno domande.

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

Questo approccio funziona bene quando la directory di destinazione è garantita e quando l'origine può essere ugualmente un file o una directory.


1
@downvoters: perché questa risposta potrebbe essere stata sottoposta a downgrade? In questo contesto, Debugè probabile che la directory esista.
Jirka Hanika,

4
Questa risposta dice "dal momento che non stai cambiando il nome del file", mentre la domanda originale diceva chiaramente "copia un file da una directory all'altra E RINOMINA IT nella directory di destinazione". Quindi questo sembra irrilevante per l'argomento.
M.Bearden,

0

Aggira, usa Rinomina ... e Assegna un nome criptico, quindi Rinomina con il nome proprio

C:

CD "C: \ Users \ Public \ Documents \ My Web Sites \ AngelFire ~ Zoe \"

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

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


0

xcopy ti permetterà di copiare un singolo file in una cartella specifica, ma non ti permetterà di definire un nome di destinazione. Se hai bisogno del nome di destinazione, rinominalo prima di copiarlo.

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

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


Supponendo che ciò funzionerebbe in un ambiente particolare (cioè, non ci sarà mai un file whee.config nella cartella di origine), per replicare il codice dell'OP, non dovrebbe includere una ridenominazione al nome originale? ren "bin\development\whee.config" whee.config.example
GlennFromIowa,

0

Inserisci un asterisco (*) alla fine del percorso di destinazione per saltare la disputa tra D e F.

Esempio:

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


0

Xxxxxxxxxxxx specifica un nome file o un nome directory sulla destinazione

(F = file, D = directory)? D

if a File : (echo F)
if a Directory (echo D)

0

Ho riscontrato lo stesso problema quando provavo a copiare il file con il nuovo nome solo se il file non esiste nella destinazione o esiste (con il nuovo nome), ma è più vecchio. La soluzione è aggiungere il *carattere alla fine del nome del file di destinazione. Esempio:

xcopy "C:\src\whee.config.txt" "C:\dest\bee.config.txt*" /D /Y

Funziona come un incantesimo, grazie
E. Grande il

-2

Non è possibile specificare che è sempre un file. Se non hai bisogno delle altre funzionalità di xcopy, perché non usare semplicemente copy?


5
Uno dei motivi è che copy, essendo un comando interno, non imposta ErrorLevel. Se si desidera essere in grado di influenzare il percorso di un file batch in caso di errore di copia, è necessario utilizzare XCOPY.
Rossmcm

2
Un altro motivo è se si desidera utilizzare altre funzionalità di xcopy, come / d
Victoria
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.