xcopy file, renombre, suprima el mensaje "¿xxx especifica un nombre de archivo ..."

404

Esto parece bastante simple y tal vez solo estoy pasando por alto el indicador adecuado , pero ¿cómo podría, en un comando, copiar un archivo de un directorio a otro y cambiarle el nombre en el directorio de destino? Aquí está mi 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"

Me pide lo siguiente cada vez:

¿TestConnectionExternal \ bin \ Debug \ whee.config especifica un nombre de archivo o nombre de directorio en el destino (F = archivo, D = directorio)?

Quiero suprimir este aviso; La respuesta es siempre F.

Sarah Vessels
fuente
15
echo f | xcopy ...
Cyclion
voto negativo por qué incluso estás usando xcopy si la copia hace lo que quieres
barlop
3
Miscrosoft : "¿por qué hacer algo simple cuando puedes hacerlo realmente confuso para tus usuarios?". Este es el momento en que simplemente deben copiar lo que se está haciendo en el mundo de Linux, ¡no busques cpnada para copiar archivos / directorios!
fduff
Recomiendo leer mi respuesta en el archivo BATCH solicita un archivo o carpeta que explique en detalle cuándo se muestra el mensaje y cómo puede ser respondido automáticamente por un lenguaje de sistema operativo de archivo por lotes independiente.
Mofi

Respuestas:

217

No use el xcopy, use copyen su lugar, no tiene este problema.

xcopygeneralmente se usa al realizar copias recursivas de múltiples archivos / carpetas, o cuando necesita las características de verificación / solicitud que ofrece. Para copias de un solo archivo, el copycomando funciona bien.

LBushkin
fuente
97
copyno copiará el archivo si toda la estructura de directorios para el destino aún no existe. xcopycreará automáticamente todos los directorios necesarios.
BQ.
41
Es sorprendente que xcopy tenga esta omisión. Si simplemente tuviera una opción para archivos como los que tiene para directorios (/ I), esto se resolvería y xcopy podría ser un gran reemplazo para la copia. En cambio, debido a este defecto, debe elegir copiar para estas situaciones.
rocketmonkeys
35
Como otros ya han señalado, la respuesta de @ Arnshea es la correcta. Esto se debe a que a) la circunstancia particular del OP de ya tener la estructura de directorios en su lugar no se mencionó en la pregunta, yb) es mucho más valioso para los futuros lectores de esta pregunta que vendrán aquí buscando una respuesta xcopyy no solo copy.
Mike Nakis
17
Bueno, la respuesta de @ Amshea también es la correcta porque la pregunta es específica de xcopy, y esta respuesta es básicamente "no use xcopy". Realmente no responde la pregunta sobre xcopy en absoluto, ¿ahora lo hace?
BrainSlugs83
99
Simplemente agregue una estrella al final del camino para el objetivo. Mira esta respuesta a continuación. stackoverflow.com/a/26034267/1231
Donny V.
638

yo suelo

echo f | xcopy /f /y srcfile destfile

para evitarlo

Ella a
fuente
17
@Arnshea - ¡gracias! Adaptado para copia de directorio silenciosoecho d | xcopy srcdirectory destdirectory /S
Dr. ABT
8
+1 @Arnshea me tomó un tiempo entender qué estás haciendo exactamente allí y, como estoy trabajando en una instalación de Windows en alemán, es echo d | xcopy ...para mí. Eres brillante
Thomas
23
Está simulando una respuesta del usuario a la pregunta que formulará xcopy.
John Munsch
55
@Thomas ¿Eso implica que un archivo por lotes que utiliza esta técnica no será portátil en diferentes configuraciones regionales?
Max Nanasy
17
@MaxNanasy Confirmé que esto no es portátil en todos los entornos locales. En una configuración alemana, pasa D para un archivo o V para un directorio. :(
Matt
177

Otra opción es usar un comodín de destino. Tenga en cuenta que esto solo funciona si los nombres de los archivos de origen y destino serán los mismos, por lo que si bien esto no resuelve el ejemplo específico del OP, pensé que valía la pena compartirlo.

Por ejemplo:

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

creará una copia del archivo "whee.config.example" en el directorio de destino sin solicitar un archivo o directorio.

Actualización : como lo menciona @chapluck:

Puedes cambiar "* "a "[newFileName].*". Persiste la extensión del archivo pero permite cambiar el nombre. O más hacky: "[newFileName].[newExt]*"para cambiar la extensión

zippycoder
fuente
1
El "eco f |" es genial, pero esto evita la salida adicional que busco a menudo para encontrar problemas en primer lugar.
Richard Anthony Hein
66
@ Durden81: como señala zippycoder, su respuesta no cambia el nombre del archivo, que era un requisito del OP.
Polyfun
66
Para ampliar la respuesta, cambiaría "*" a "[newFileName]. *". Persiste la extensión del archivo pero permite cambiar el nombre. O más hacky: "[newFileName]. * [NewExt]" para cambiar la extensión.
chapluck el
¡Gracias! La sección de actualización es lo que resolvió mi problema, donde el nombre del archivo necesitaba ser cambiado, manteniendo la extensión y asumiendo que es el archivo. XCopy debería haber tenido esto como un interruptor.
Stanislav
1
Me funcionó sin el asterisco al final, solo barra invertida.
tivnet
91

Hay algún tipo de función no documentada en XCOPY. puedes usar:

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

Lo probé hoy. :-)

ienaxxx
fuente
44
Muchas gracias. Agregué un "*" al final del archivo de destino y funcionó .. :) +1 para el truco
Rahul Patel
2
Excelente solución: limpia, elegante, no utiliza un comando diferente, compatible con las banderas de xcopy existentes, funciona perfectamente. Esta debería ser la respuesta más votada.
Brian Swift
77
La respuesta es incorrecta, el comando dará como resultado whee.config.examplela carpeta de destino, porque whee.config*coincide whee.config.example.
Miau
2
Acabo de crear un archivo b.txtxt, y luego inicié el comando xcopy a.txt b.txt* /F /Yy el archivo a.txtse ha copiado b.txt, como se esperaba. Además de eso, mientras se usan los /F /Yinterruptores, la copia real se muestra en la pantalla, exactamente como se esperaba.
Dominique
1
@Meow: no, ya que el comodín está en el destino, no en la fuente.
ienaxxx
74

Simplemente vaya a http://technet.microsoft.com/en-us/library/bb491035.aspx

Esto es el PROBLEMA PRINCIPAL "... Si el Destino no contiene un directorio existente y no termina con una barra diagonal inversa (), aparece el siguiente mensaje: ...

¿El destino especifica un nombre de archivo o un nombre de directorio en el destino (F = archivo, D = directorio)?

Puede suprimir este mensaje utilizando la opción de línea de comandos / i, lo que hace que xcopy suponga que el destino es un directorio si el origen es más de un archivo o un directorio.

Me tomó un tiempo, pero todo lo que se necesita es RTFM.

Cuenta
fuente
77
¡Esta debería ser la mejor respuesta! Solo para ser realmente claro para los demás. Si está copiando UN archivo de un lugar a otro Y desea que se cree la estructura de directorios completa, use el siguiente comando: xcopy / "C: \ Data \ Images \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb -67ecff20c96b.jpg "" C: \ Datos de destino \\ Imágenes \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb-67ecff20c96b.jpg \ ". Sí, coloque una barra diagonal inversa al final del nombre del archivo.
adudley
44
Buena respuesta, pero no resuelve el problema. Intenté xcopy hello.txt hello2 \. Sin aviso Ahora intento xcopy hello.txt hello3 (sin barra invertida). Me pregunta si dest es file o dir. Necesito una manera de decirle que asuma F o D en un script.
RuntimeException
27
Esta es una respuesta muy extraña, especialmente debido a los votos positivos, el inútil "RTFM" snark, y los comentarios que anotan las respuestas "populares" ... ¡ya que no aborda la pregunta original! La pregunta original decía claramente "copiar un archivo de un directorio a otro Y NOMBRARLO en el directorio de destino". El intento de respuesta dado anteriormente parece abordar el caso diferente de copiar el archivo con el nombre del archivo de destino siendo el MISMO nombre como el archivo fuente. La solución "desordenada" dada por @Arnshea es la única respuesta de un solo paso que veo aquí, por lo tanto, su "popularidad".
M.Bearden
3
El Sr. Bearden fue bastante cortés, pero dado el número de votos positivos, siento la necesidad de enumerar expresamente los problemas con esta respuesta: 1) el 1 párrafo que parece dar una solución al problema del OP (párrafo 4 de 5), no no funcionará, porque el PO es copiar y cambiar el nombre de un archivo , no un directorio; 2) el enlace que figura en la parte superior de la respuesta no proporciona una solución; 3) la declaración del problema principal no se aplica a la pregunta del PO; y 4) la respuesta es ofensiva, con gritos en el segundo párrafo e insultos en el último. Quizás debería haber releído la pregunta.
GlennFromIowa
2
Toda la respuesta dada aquí es copiar a un directorio, no copiar en un destino de archivo, que es posible y no está documentado, vea la otra respuesta de zippycoder, chapluck, LBushkin
pdem
27

Entonces, hay una solución simple para esto. Es ciertamente incómodo, pero funciona. xcopy no le preguntará si el destino es un directorio o archivo SI el nuevo archivo (nombre de archivo) ya existe. Si precede su comando xcopy con un eco simple al nuevo nombre de archivo, sobrescribirá el archivo vacío. Ejemplo

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

Esto es de la respuesta de Bills.

Solo para ser realmente claro para los demás.

Si está copiando UN archivo de un lugar a otro Y desea que se cree la estructura completa del directorio, use el siguiente 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í, coloque una barra diagonal inversa al final del nombre del archivo y NO le preguntará si es un archivo o directorio. Debido a que solo hay UN archivo en la fuente, asumirá que es un archivo.

adudley
fuente
12
Esto está mal. Cuando ejecuto "xcopy versionBase.txt asd \ versionBase.txt \" y el directorio asd no está presente, obtengo el archivo asd \ versionBase.txt \ versionBase.txt.
Cristian Niculescu
1
Al igual que con otras respuestas en esta página, esta publicación no aborda la pregunta original. La pregunta era cómo copiar Y renombrar (en un paso) un archivo. Al igual que con otras respuestas aparentemente confusas, esto habla sobre cómo copiar el archivo SIN renombrar.
M.Bearden
Sin mencionar el hecho de que realmente crea un directorio con ese nombre, no una carpeta. dir "C:\Target Data\\Images\2013\08\12" 09/25/2015 10:48 AM <DIR> 85e4a707-2672-481b-92fb-67ecff20c96b.jpg
Pruébelo
3

xcopy src dest /I

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

jerryh91
fuente
2

Tuve un problema similar y tanto robocopy como xcopy no ayudaron, ya que quería suprimir los comentarios y usar un nombre de archivo de destino diferente. encontré

type filename.txt > destfolder\destfilename.txt

trabajando según mis requisitos.

usuario140185
fuente
2

De vuelta a la pregunta original:

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

podría hacerse con dos comandos, por ejemplo:

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

Simplemente agregando "\ .." a la ruta del archivo de destino, se crea el directorio de destino si aún no existe. En este caso

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

que es el directorio padre del directorio no existente

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

Al menos para WIN7 mkdir no le importa si el directorio

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

Realmente existe.

grenix
fuente
Una solución interesante si el directorio no existe. Desafortunadamente, la siguiente línea (en mis pruebas) todavía le pregunta al usuario.
GlennFromIowa
Tiene razón, debe ser xcopy "bin \ development \ whee.config.example" "c: \ mybackup \ TestConnectionExternal \ bin \ Debug \ whee.config \". Utilicé mi método para copiar archivos a un directorio que podría no existir. Para cambiar el nombre, parece que se debe agregar una barra invertida al final.
grenix
2

XCOPY con * al final del destino para copiar archivos si existen o no en el destino XCOPY con \ al final del destino para copiar carpetas y contenidos si existen o no en el destino

Alternativamente

RoboForm SOURCE DEST FILE para archivos RoboForm SOURCE DEST para carpetas

Colin Hay
fuente
1

Sugiero en robocopylugar de copyo xcopy. Utilizado como comando o en GUI en clientes o servidores. Tolera las pausas de la red y puede optar por ignorar los atributos del archivo al copiar los atributos de copia por archivo. Ah, y es compatible con máquinas de múltiples núcleos, por lo que los archivos se copian mucho más rápido en "paralelo" entre sí en lugar de secuencialmente. robocopyse puede encontrar en MS TechNet.

surferdj
fuente
2
Yo uso robocopy todo el tiempo. Sin embargo, para la pregunta de este póster, no funcionará, ya que no puede cambiar el nombre de los archivos. Algo que no sabía antes de hoy es que xcopy tiene un modificador / z, que es tolerante a las pausas de la red.
GlennFromIowa
1

Lo correcto si desea copiar solo el archivo y cambiar su nombre en el destino es:

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

Y va a funcionar bien

Thanos
fuente
1

Para duplicar archivos grandes, xopy con el modificador / J es una buena opción. En este caso, simplemente canalice una F para el archivo o una D para el directorio. Además, puede guardar trabajos en una matriz para futuras referencias. Por ejemplo:

$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

Gracias a Chand con algunas modificaciones: https://stackoverflow.com/users/3705330/chand

MAZDA
fuente
0

Use copiar en lugar de xcopy al copiar archivos.

por ejemplo, copiar "bin \ development \ whee.config.example" "TestConnectionExternal \ bin \ Debug \ whee.config"

Peter
fuente
1
Estoy tratando de copiar un archivo a la misma carpeta con un nombre diferente y xcopy no funciona. Yo uso copy /Y source destinationpara pasar la confirmación de sobrescritura.
SandRock
0

Como en realidad no está cambiando el nombre de archivo, puede extraer el nombre de archivo del destino y no habrá preguntas.

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

Este enfoque funciona bien cuando se garantiza que el directorio de destino existe, y cuando la fuente puede ser igualmente un archivo o directorio.

simmo
fuente
1
@downvoters: ¿Por qué esta respuesta podría haber sido rechazada? En este contexto, Debuges probable que el directorio exista.
Jirka Hanika
44
Esta respuesta dice "ya que en realidad no está cambiando el nombre de archivo", mientras que la pregunta original decía claramente "copie un archivo de un directorio a otro Y NOMÉGELO en el directorio de destino". Entonces esto parece irrelevante para el tema.
M.Bearden
0

Evite, use ReName ... y asígnele un nombre críptico, luego cámbiele el nombre a su nombre apropiado

C:

CD "C: \ Usuarios \ Público \ Documentos \ Mis sitios web \ AngelFire ~ Zoe \"

XCopy / D / I / V / Y "C: \ Usuarios \ Público \ Documentos \ Mis sitios web \ HostGator ~ ZoeBeans \ cop.htm"

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

JollyChollie
fuente
0

xcopy le permitirá copiar un solo archivo en una carpeta especificada, simplemente no le permitirá definir un nombre de destino. Si necesita el nombre del destino, simplemente cámbiele el nombre antes de copiarlo.

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

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

Chuck Emanuel
fuente
Suponiendo que esto funcionaría en un entorno particular (es decir, es seguro que nunca habrá un whee.config en la carpeta de origen), para replicar el código del OP, ¿no debería incluir un cambio de nombre al nombre original? ren "bin\development\whee.config" whee.config.example
GlennFromIowa
0

Coloque un asterisco (*) al final de la ruta de destino para omitir la disputa de D y F.

Ejemplo:

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

Iqra.
fuente
0

¿Xxxxxxxxxxxx especifica un nombre de archivo o un nombre de directorio en el destino

(F = file, D = directory)? D

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

Me encontré con el mismo problema cuando intento copiar el archivo con un nuevo nombre solo si el archivo no existe en el destino o existe (con un nuevo nombre), pero es anterior. La solución es agregar *char al final del nombre del archivo de destino. Ejemplo:

xcopy "C:\src\whee.config.txt" "C:\dest\bee.config.txt*" /D /Y
Ivan Alexandrov
fuente
Funciona como un encanto, gracias
E. Gran
-2

No puede especificar que siempre sea un archivo. Si no necesita las otras funciones de xcopy, ¿por qué no usar solo regular copy?

Gabe
fuente
55
Una razón es que copy, al ser un comando interno, no establece ErrorLevel. Si desea poder influir en la ruta de un archivo por lotes si se produce un error de copia, debe usarlo XCOPY.
rossmcm
2
Otra razón es si desea utilizar otras funciones de xcopy, como / d
Victoria