xcopy, renomeie, suprima da mensagem “xxx especifica um nome de arquivo…”

404

Isso parece bastante simples e talvez eu esteja apenas ignorando o sinalizador adequado , mas como eu, em um comando, copiava um arquivo de um diretório para outro e o renomeia no diretório de destino? Aqui está o meu 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"

Ele sempre solicita o seguinte:

TestConnectionExternal \ bin \ Debug \ whee.config especifica um nome de arquivo ou diretório no destino (F = arquivo, D = diretório)?

Eu quero suprimir esse prompt; a resposta é sempre F.

Sarah Vessels
fonte
15
eco f | xcopy ...
Cyclion
downvote por que você está mesmo usando xcopy se cópia faz o que quiser
barlop
3
Miscrosoft : "por que tornar algo simples quando você pode torná-lo realmente confuso para seus usuários?". Este é o momento em que eles devem apenas copiar o que está sendo feito no mundo Linux, cpnão é necessário copiar arquivos / diretórios por aí!
Fduff 18/09/19
Eu recomendo que eu leia minha resposta no arquivo BATCH solicite um arquivo ou pasta explicando em detalhes quando o prompt é exibido e como ele pode ser respondido automaticamente por um arquivo em lote, independente do idioma do sistema operacional.
Mofi

Respostas:

217

Não use o xcopy, use em copyvez disso, ele não tem esse problema.

xcopygeralmente é usado ao executar cópias recursivas de vários arquivos / pastas ou quando você precisa dos recursos de verificação / solicitação que ele oferece. Para cópias de arquivo único, o copycomando funciona perfeitamente.

LBushkin
fonte
97
copynão copiará o arquivo se a estrutura de diretórios inteira do destino ainda não existir. xcopycriará automaticamente todos os diretórios necessários.
BQ.
41
É incrível que o xcopy tenha essa omissão. Se simplesmente tivesse uma opção para arquivos como os diretórios (/ I), isso seria resolvido e o xcopy poderia ser um ótimo substituto para a cópia. Em vez disso, devido a esse defeito, você deve escolher a cópia para essas situações.
Rocketmonkeys
35
Como outros já apontaram, a resposta de @ Arnshea é a correta. Isso ocorre porque a) a circunstância específica do OP de já ter a estrutura de diretórios no local não foi mencionada na pergunta eb) é muito mais valiosa para os futuros leitores dessa pergunta que virão aqui em busca de uma resposta xcopye não apenas copy.
9788 Mike Nakis #
17
A resposta do @ Amshea também é a correta, porque a pergunta é específica para o xcopy, e essa resposta é basicamente "não use o xcopy". Realmente não responde a pergunta sobre o xcopy, agora responde?
BrainSlugs83
9
Basta adicionar uma estrela no final do caminho para o alvo. Veja esta resposta abaixo. stackoverflow.com/a/26034267/1231
Donny V.
638

eu uso

echo f | xcopy /f /y srcfile destfile

para contornar isso.

Shea
fonte
17
@Arnshea - obrigado! Adaptado para a cópia silenciosa do diretórioecho d | xcopy srcdirectory destdirectory /S
Dr. ABT
8
+1 @Arnshea demorei algum tempo para entender o que você está fazendo exatamente lá e, como estou trabalhando em uma instalação alemã do Windows, é echo d | xcopy ...para mim. Você é brilhante
Thomas
23
Ele está simulando uma resposta do usuário para a pergunta que o xcopy fará.
John Munsch
5
@ Thomas: Isso implica que um arquivo em lotes que usa essa técnica não será portátil em diferentes localidades?
MaxNanasy
17
@MaxNanasy Confirmei que isso não é portátil em locais. Em uma configuração alemã, você passa D para um arquivo ou V para um diretório. :(
Matt
177

Outra opção é usar um curinga de destino. Observe que isso só funciona se os nomes de arquivos de origem e destino forem os mesmos; portanto, embora isso não resolva o exemplo específico do OP, achei que valia a pena compartilhar.

Por exemplo:

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

criará uma cópia do arquivo "whee.config.example" no diretório de destino sem solicitar o arquivo ou diretório.

Atualização : Conforme mencionado por @chapluck:

Você pode mudar "* "para "[newFileName].*". Ele persiste na extensão do arquivo, mas permite renomear. Ou mais hacky: "[newFileName].[newExt]*"para alterar a extensão

zippycoder
fonte
11
O "eco f |" O caminho é legal, mas isso evita a saída extra que eu frequentemente busco para encontrar problemas em primeiro lugar.
Richard Anthony Hein
6
@ Durden81 - como o zippycoder aponta, a resposta deles não renomeia o arquivo, que era um requisito do OP.
Polyfun
6
Para estender a resposta, eu mudaria "*" para "[newFileName]. *". Ele persiste na extensão do arquivo, mas permite renomear. Ou mais hacky: "[newFileName]. * [NewExt]" para alterar a extensão.
#
Obrigado! A seção de atualização foi a que resolveu o meu problema, onde o nome do arquivo precisava ser alterado, mantendo a extensão e assumindo que era o arquivo. XCopy deveria ter tido isso como uma opção.
Stanislav
11
Trabalhou para mim sem o asterisco no final, apenas barra invertida.
tivnet
91

Há algum tipo de recurso não documentado no XCOPY. você pode usar:

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

Eu testei hoje. :-)

ienaxxx
fonte
4
Muito obrigado. Eu adicionei um "*" no final do arquivo de destino e funcionou .. :) +1 para o truque
Rahul Patel
2
Excelente solução - limpa, elegante, não usa um comando diferente, compatível com os sinalizadores existentes do xcopy, funciona perfeitamente. Essa deve ser a resposta mais votada.
Brian Swift
7
A resposta está incorreta, o comando resultará whee.config.examplena pasta de destino, porque whee.config*corresponde whee.config.example.
Miau
2
Acabei de criar um arquivo b.txtxt, iniciei o comando xcopy a.txt b.txt* /F /Ye o arquivo a.txtfoi copiado para o b.txtesperado. Além disso, ao usar os /F /Ycomutadores, a cópia real é mostrada na tela, exatamente como o esperado.
Dominique
11
@ Meow: não, já que o curinga está no destino, não na fonte.
precisa saber é o seguinte
74

Basta acessar http://technet.microsoft.com/en-us/library/bb491035.aspx

Aqui está o que é o PRINCIPAL PROBLEMA "... Se o Destino não contiver um diretório existente e não terminar com uma barra invertida (), a seguinte mensagem será exibida: ...

O destino especifica um nome de arquivo ou diretório no destino (F = arquivo, D = diretório)?

Você pode suprimir essa mensagem usando a opção de linha de comando / i, que faz com que o xcopy assuma que o destino é um diretório se a origem for mais de um arquivo ou diretório.

Demorei um pouco, mas tudo o que preciso é RTFM.

Conta
fonte
7
Essa deve ser a melhor resposta! Apenas para ser realmente claro para os outros. Se você estiver copiando UM arquivo de um lugar para outro E desejar criar a estrutura de diretórios completa, use o seguinte comando: xcopy / "C: \ Data \ Images \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb -67ecff20c96b.jpg "" C: \ Dados de destino \\ Imagens \ 2013 \ 08 \ 12 \ 85e4a707-2672-481b-92fb-67ecff20c96b.jpg \ ". Sim, coloque uma barra invertida no final do nome do arquivo!
adudley
4
Boa resposta, mas não resolve o problema. Eu tentei xcopy hello.txt hello2 \. Nenhum aviso. Agora eu tento xcopy hello.txt hello3 (sem barra invertida). Ele me pergunta se o destino é file ou dir. Eu preciso de uma maneira de dizer para assumir F ou D em um script.
RuntimeException
27
Essa é uma resposta muito estranha, principalmente por causa dos votos positivos, do inútil "RTFM" e dos comentários que colocam as respostas "populares" ... uma vez que não aborda a pergunta original! A pergunta original dizia claramente "copie um arquivo de um diretório para outro E renomeie-o no diretório de destino". A tentativa de resposta fornecida acima parece abordar os diferentes casos de cópia do arquivo com o nome do arquivo de destino sendo o mesmo nome como o arquivo de origem. A solução "bagunçada" dada pelo @Arnshea é a única resposta em uma única etapa que vejo aqui - portanto, sua "popularidade".
precisa saber é o seguinte
3
O Sr. Bearden foi bastante educado, mas, dado o número de votos positivos, sinto a necessidade de listar expressamente os problemas com esta resposta: 1) o 1 parágrafo que parece dar uma solução para o problema do OP (parágrafo 4 de 5), se não funcionar, porque o OP é copiar e renomear um arquivo , não um diretório; 2) o link fornecido na parte superior da resposta não fornece uma solução; 3) a declaração da questão principal não se aplica à pergunta do OP; e 4) a resposta é ofensiva, com gritos no segundo parágrafo e insultos no último. Talvez ele devesse ter relido a pergunta.
GlennFromIowa
2
Tudo resposta dada aqui estão para copiar para um diretório, não para copiar em um destino de arquivo, o que é possível e não documentada, veja a outra resposta de zippycoder, chapluck, LBushkin
PDEM
27

Portanto, há uma correção simples para isso. É reconhecidamente estranho, mas funciona. O xcopy não solicitará para descobrir se o destino é um diretório ou arquivo SE o novo arquivo (nome do arquivo) já existir. Se você preceder o comando xcopy com um simples eco no novo nome do arquivo, ele substituirá o arquivo vazio. Exemplo

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

Isto é da resposta de Bills.

Apenas para ser realmente claro para os outros.

Se você estiver copiando UM arquivo de um lugar para outro E quiser criar a estrutura de diretórios completa, use o seguinte 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\" 

Sim, coloque uma barra invertida no final do nome do arquivo e ele NÃO perguntará se é um arquivo ou diretório. Como existe apenas um arquivo na fonte, ele assumirá que é um arquivo.

adudley
fonte
12
Isto está errado. Ao executar "xcopy versionBase.txt asd \ versionBase.txt \" e o diretório asd não está presente, obtenho o arquivo asd \ versionBase.txt \ versionBase.txt.
Cristian Niculescu
11
Como com outras respostas nesta página, esta postagem não está abordando a pergunta original. A questão era como copiar e renomear (em uma etapa) um arquivo. Como com outras respostas aparentemente confusas, isso fala sobre como copiar o arquivo SEM renomear.
M.Bearden
Sem mencionar o fato de que ele realmente cria um diretório com esse nome, não uma pasta. Teste e execute um dir depois, e você verá algo parecido com isto: 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
fonte
2

Eu tive um problema semelhante e o robocopy e o xcopy não ajudaram, pois queria suprimir os comentários e usar um nome de arquivo de destino diferente. eu encontrei

type filename.txt > destfolder\destfilename.txt

trabalhando de acordo com minhas necessidades.

user140185
fonte
2

De volta à pergunta original:

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

Isso pode ser feito com dois comandos, por exemplo:

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

Simplesmente anexando "\ .." ao caminho do arquivo de destino, o diretório de destino será criado se ele ainda não existir. Nesse caso

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

qual é o diretório pai do diretório não existente

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

Pelo menos para WIN7 mkdir não se importa se o diretório

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

realmente existe.

grenix
fonte
Uma correção interessante se o diretório não existir. Infelizmente, a próxima linha (nos meus testes) ainda solicita ao usuário.
GlennFromIowa
Você está certo de que deve ser xcopy "bin \ development \ whee.config.example" "c: \ mybackup \ TestConnectionExternal \ bin \ Debug \ whee.config \". Eu usei minha abordagem para copiar arquivos para um diretório que pode não existir. Para renomear, parece que uma barra invertida deve ser adicionada no final.
23616 grenix
2

XCOPY com * no final do destino para copiar arquivos, existindo ou não no destino XCOPY com * no final do destino para copiar pastas e conteúdos, existindo ou não no destino

alternativamente

RoboForm SOURCE DEST FILE para arquivos RoboForm SOURCE DEST para pastas

Colin Hay
fonte
1

Sugiro em robocopyvez de copyou xcopy. Usado como comando ou na GUI em clientes ou servidores. Tolerante a pausas na rede e você pode optar por ignorar os atributos do arquivo ao copiar a cópia por atributos do arquivo. Ah, e ele suporta máquinas com vários núcleos, para que os arquivos sejam copiados muito mais rapidamente em "paralelo" entre si, em vez de sequencialmente. robocopypode ser encontrado no MS TechNet.

surferdj
fonte
2
Eu uso robocopy o tempo todo. No entanto, para a pergunta deste pôster, ele não funcionará, pois não pode renomear arquivos. Algo que eu não sabia até hoje é que o xcopy tem um switch / z, tolerante a pausas na rede!
GlennFromIowa
1

A coisa certa a fazer se você deseja copiar apenas o arquivo e alterar o nome no destino é:

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

E vai funcionar bem

Thanos
fonte
1

Para duplicar arquivos grandes, o xopy com a opção / J é uma boa opção. Nesse caso, basta canalizar um F para arquivo ou um D para diretório. Além disso, você pode salvar trabalhos em uma matriz para futuras referências. Por exemplo:

$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

Graças a Chand com algumas modificações: https://stackoverflow.com/users/3705330/chand

MAZDA
fonte
0

Use copiar em vez de xcopy ao copiar arquivos.

por exemplo, copie "bin \ development \ whee.config.example" "TestConnectionExternal \ bin \ Debug \ whee.config"

Pedro
fonte
11
Estou tentando copiar um arquivo para a mesma pasta com um nome diferente e o xcopy não pode funcionar. Eu uso copy /Y source destinationpara passar na confirmação de substituição.
#
0

Como você não está realmente alterando o nome do arquivo, você pode retirá-lo do destino e não haverá perguntas.

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

Essa abordagem funciona bem quando é garantido que o diretório de destino existe e quando a fonte pode ser igualmente um arquivo ou diretório.

simmo
fonte
11
@ downvoters: Por que essa resposta poderia ter sido reduzida? Nesse contexto, Debugé provável que o diretório exista.
Jirka Hanika #
4
Essa resposta diz "como você não está realmente alterando o nome do arquivo", enquanto a pergunta original dizia claramente "copie um arquivo de um diretório para outro E renomeie-o no diretório de destino". Portanto, isso parece irrelevante para o tópico.
M.Bearden 15/08/14
0

Solução alternativa, use Renomear ... e dê um nome críptico a ele e, em seguida, Renomeie-o ao seu Nome próprio

C:

CD "C: \ Usuários \ Público \ Documentos \ Meus Sites \ AngelFire ~ Zoe \"

XCopy / D / I / V / A "C: \ Usuários \ Público \ Documentos \ Meus sites \ HostGator ~ ZoeBeans \ cop.htm"

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

JollyChollie
fonte
0

O xcopy permitirá que você copie um único arquivo em uma pasta especificada, mas não permitirá que você defina um nome de destino. Se você precisar do nome do destino, basta renomeá-lo antes de copiá-lo.

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

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

Chuck Emanuel
fonte
Supondo que isso funcionaria em um ambiente específico (ou seja, nunca haverá um whee.config na pasta de origem), para replicar o código do OP, não deveria incluir uma renomeação para o nome original? ren "bin\development\whee.config" whee.config.example
GlennFromIowa
0

Coloque um asterisco (*) no final do caminho de destino para pular a disputa de D e F.

Exemplo:

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

Iqra.
fonte
0

Xxxxxxxxxxxx especifica um nome de arquivo ou diretório no destino

(F = file, D = directory)? D

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

Encontrei o mesmo problema ao tentar copiar um arquivo com novo nome apenas se o arquivo não existir no destino ou existir (com novo nome), mas for mais antigo. A solução é adicionar *char no final do nome do arquivo de destino. Exemplo:

xcopy "C:\src\whee.config.txt" "C:\dest\bee.config.txt*" /D /Y
Ivan Alexandrov
fonte
Funciona como um encanto, thx
E.Big
-2

Você não pode especificar que seja sempre um arquivo. Se você não precisa dos outros recursos do xcopy, por que não usar apenas o regular copy?

Gabe
fonte
5
Uma razão é que copy, sendo um comando interno, não define ErrorLevel. Se você deseja influenciar o caminho de um arquivo em lotes, se ocorrer um erro de cópia, será necessário usá-lo XCOPY.
Rossmcm 7/07
2
Outra razão é que se você quiser usar outros recursos do xcopy, como / d
Victoria