Simplesmente não consigo encontrar uma maneira na linha de comando de dizer "copie todos os arquivos do diretório A para o diretório B, mas se o arquivo já existir no diretório B, não o substitua, não importa qual arquivo é mais recente , e não me pergunte. "
Já passei por copiar, mover, xcopy e robocopy, e o mais próximo que posso chegar é que você pode dizer ao robocopy "copiar A para B, mas não sobrescrever arquivos mais novos por arquivos mais antigos", mas isso não funciona para mim . Eu olhei para xxcopy, mas descartei-o, pois não quero ter uma dependência de terceiros em um evento pós-compilação do Visual Studio que exigirá que outros usuários do SVN tenham essa ferramenta instalada para fazer a compilação.
Quero adicionar uma linha de comando ao evento pós-compilação no Visual Studio 2010 para que os arquivos gerados a partir dos modelos T4 para novos objetos de modelo EF sejam distribuídos para as pastas de projeto às quais pertencem, mas arquivos regenerados para objetos existentes não sobrescreva arquivos de destino potencialmente editados.
Uma vez que o modelo T4 é regenerado, o arquivo de origem é sempre mais recente e não posso usar a opção "mais recente" de maneira confiável, não acho.
Eu uso classes parciais para os itens para os quais posso, mas há outras coisas que eu gero que não podem usar classes parciais (por exemplo, gerando um arquivo EditorTemplate ou DisplayTemplate * .ascx padrão).
Alguém já resolveu algum problema semelhante?
fonte
cmd.exe
ofor
comando de? Se não, eu recomendo que você executefor /?
e use isso.Respostas:
fonte
~nx
nos%~nxF
significa exatamente?~nxF
a variável seF
transforma em um nome de arquivo e uma extensão.Para elaborar (usando as respostas Hydrargyrum, HailGallaxar e Andy Schmidt):
/E
faz o Robocopy copiar recursivamente subdiretórios, incluindo os vazios./XC
exclui arquivos existentes com o mesmo carimbo de data / hora, mas tamanhos de arquivo diferentes. Robocopy normalmente os substitui./XN
exclui arquivos existentes mais recentes do que a cópia no diretório de destino. Robocopy normalmente os substitui./XO
exclui arquivos existentes mais antigos do que a cópia no diretório de destino. Robocopy normalmente os substitui.Com as classes Changed, Older e Newer excluídas, o Robocopy faz exatamente o que o autor da postagem original deseja - sem precisar carregar um ambiente de script.
Referências: Technet , Wikipedia
Download de: Microsoft Download Link (link verificado pela última vez em 30 de março de 2016)
fonte
/e
? E se você usar em/s
vez disso? Não quero um monte de subpastas vazias.A solução de Belisarius é boa.
Para elaborar essa resposta ligeiramente concisa:
/E
faz o Robocopy copiar recursivamente subdiretórios, incluindo os vazios./XC
exclui arquivos existentes com o mesmo carimbo de data / hora, mas tamanhos de arquivo diferentes. Robocopy normalmente os substitui./XN
exclui arquivos existentes mais novos do que a cópia no diretório de origem. Robocopy normalmente os substitui./XO
exclui arquivos existentes mais antigos que a cópia no diretório de origem. Robocopy normalmente os substitui.Com as classes Changed, Older e Newer excluídas, o Robocopy faz exatamente o que o autor da postagem original deseja - sem precisar carregar um ambiente de script.
fonte
Você pode tentar isto:
-y
simplesmente solicita antes de sobrescrever e podemos canalizar n para todas essas perguntas. Portanto, em essência, isso seria apenas copiar arquivos não existentes. :)fonte
copy /-y
assume automaticamente Não, uma vez que stdin fica sem entrada. Você pode omitir o primeiro explíciton
ou canalizar< nul
para ele, e a mesma coisa acontece.Aqui está em forma de arquivo em lote:
fonte
Só quero esclarecer algo sobre meu próprio teste.
@Hydrargyrum escreveu:
Isso é realmente para trás. O XN "exclui arquivos mais recentes", mas exclui arquivos mais recentes do que a cópia no diretório de destino . O XO "exclui mais antigos", mas exclui arquivos mais antigos do que a cópia no diretório de destino .
Claro, faça seus próprios testes como sempre.
fonte
Existe uma maneira estranha de fazer isso com xcopy:
Basta incluir tantos n's quantos os arquivos que você está copiando e ele responderá n a todas as perguntas de substituição.
fonte
copy
, veja esta resposta , especificamente o comentário @mwfearnley:copy /-y
assume automaticamenten
quando o stdin é esgotado, então você pode, por exemplo,echo n
apenas uma vez e ainda funciona./ XX: eXclui arquivos e diretórios "eXtra" (presentes no destino, mas não na origem). Isso impedirá qualquer exclusão do destino. (este é o padrão)
fonte
Robocopy pode ser baixado aqui para sistemas onde ainda não está instalado. (Ie Windows Server 2003.)
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (não é necessário reinicializar para instalação)
Lembre-se de definir seu caminho para o exe robocopy. Faça isso clicando com o botão direito em "meu computador"> propriedades> avançado> "Variáveis de ambiente", encontre a variável de sistema do caminho e adicione-a ao final: "; C: \ Arquivos de programas \ Kits de recursos do Windows \ Ferramentas" ou onde você quiser instalado. Certifique-se de deixar as strings da variável de caminho que já estão lá e apenas acrescentar o caminho adicional.
uma vez que o caminho é definido, você pode executar o comando que belisarius sugere. Funciona muito bem.
fonte
Não me deixará comentar diretamente sobre as mensagens incorretas - mas deixe-me apenas avisar a todos, que a definição das opções / XN e / XO são INVERTIDAS em comparação com o que foi postado nas mensagens anteriores.
A opção Excluir arquivos mais antigos / mais recentes é consistente com as informações exibidas no registro do RoboCopy: o RoboCopy irá iterar através da FONTE e então relatar se cada arquivo na FONTE é "MAIS ANTIGO" ou "MAIS NOVO" do que o arquivo no destino.
Conseqüentemente, / XO excluirá arquivos ANTIGA FONTE (o que é intuitivo), não "mais antigo que a fonte", como foi reivindicado aqui.
Se você deseja copiar apenas arquivos de origem novos ou alterados, mas evita substituir arquivos de destino mais recentes, então / XO é a opção correta a ser usada.
fonte
Uma abordagem simples seria usar a opção / MIR para espelhar os dois diretórios. Basicamente, ele copiará apenas os novos arquivos para o destino. No próximo comando, substitua a origem e o destino pelos caminhos para suas pastas, o script pesquisará qualquer arquivo com qualquer extensão.
fonte
Isso é o que funcionou para mim. Eu uso isso para "adicionar" arquivos à outra unidade, sem sobrescrever.
Arquivo de lote: robocopy-missingfiles.bat
Exemplo:
Faça o teste antes da implementação.
fonte