Pergunta

Eu simplesmente não consigo encontrar um caminho em linha de comando para dizer "copiar todos os arquivos do diretório para o diretório de B, mas se o arquivo já existir no diretório de B, não substituí-lo, não importa qual arquivo é mais recente, e não pedir-me."

Eu tenho sido através de copiar, mover, xcopy & robocopy, e o mais próximo que eu posso chegar é que você pode dizer robocopy "cópia de a para B, mas não substituir arquivos mais recentes, com os arquivos mais antigos," mas isso não funciona para mim.Eu olhei para xxcopy, mas descartado, como eu não quero ter um terceiro dependência no Visual Studio evento post-build, o que exigirá outros SVN utilizadores para ter essa ferramenta instalada, a fim de fazer a compilação.

Eu quero adicionar uma linha de comando para o evento post-build no Visual Studio 2010 para que os arquivos que são gerados a partir da T4 modelos novos EF modelo de objetos são distribuídos para as pastas do projecto, à qual eles pertencem, mas regenerado arquivos para objetos existentes não substituir potencialmente editado arquivos de destino.

Desde o modelo T4 regenera, o arquivo de origem é sempre a mais recente, e eu não posso usar o "mais recente" mudar de forma confiável, eu não acho.

Eu uso parcial de classes para os itens para os quais eu posso, mas há outras coisas que eu gerar que não pode usar classes parciais (por exemplo,a geração de um padrão EditorTemplate ou DisplayTemplate *.ascx arquivo).

Qualquer um tem quaisquer problemas semelhantes têm resolvido?

Foi útil?

Solução

For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"

Outras dicas

Robocopy, ou "cópia robusta de arquivo", é um comando de replicação de diretório de linha de comando. Ele está disponível como parte do kit de recursos do Windows, começando no Windows NT 4.0 e foi introduzido como um recurso padrão do Windows Vista, Windows 7 e Windows Server 2008.

   robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO

Para elaborar (usando hidrargyrum, Hailgallaxar e Andy Schmidt Answers):

  • /E Faz de robocopia copiar recursivamente os subdiretos, incluindo os vazios.
  • /XC Exclui arquivos existentes com o mesmo registro de data e hora, mas tamanhos de arquivo diferentes. Robocopy normalmente substitui esses.
  • /XN Exclui os arquivos existentes mais recentes que a cópia no diretório de destino. Robocopy normalmente substitui esses.
  • /XO Exclui os arquivos existentes mais antigos que a cópia no diretório de destino. Robocopy normalmente substitui esses.

Com as classes alteradas, mais antigas e mais recentes excluídas, o Robocopy faz exatamente o que o pôster original deseja - sem precisar carregar um ambiente de script.

Referências: Technet, Wikipedia
Baixar de: Link para download da Microsoft (Link pela última vez verificado em 30 de março de 2016)

A solução de Belisarius é boa.

Para elaborar a resposta ligeiramente concisa:

  • /E Faz de robocopia copiar recursivamente os subdiretos, incluindo os vazios.
  • /XC Exclui arquivos existentes com o mesmo registro de data e hora, mas tamanhos de arquivo diferentes. Robocopy normalmente substitui esses.
  • /XN Exclui os arquivos existentes mais recentes que a cópia no diretório de origem. Robocopy normalmente substitui esses.
  • /XO Exclui os arquivos existentes mais antigos que a cópia no diretório de origem. Robocopy normalmente substitui esses.

Com as classes alteradas, mais antigas e mais recentes excluídas, o Robocopy faz exatamente o que o pôster original deseja - sem precisar carregar um ambiente de script.

Você pode tentar isso:

echo n | copy /-y <SOURCE> <DESTINATION>

-y Simplesmente solicita antes da substituição e podemos colocar n para todas essas perguntas. Portanto, isso, em essência, apenas copiaria arquivos inexistentes. :)

Aqui está no formulário de arquivo em lote:

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"

Eu só quero esclarecer algo dos meus próprios testes.

@Hydrargyrum escreveu:

  • /XN exclui os arquivos existentes mais recentes que a cópia no diretório de origem. Robocopy normalmente substitui esses.
  • /XO exclui os arquivos existentes mais antigos que a cópia no diretório de origem. Robocopy normalmente substitui esses.

Isso é realmente para trás. XN "exclui arquivos mais recentes", mas exclui arquivos mais recentes que a cópia no destino diretório. XO "exclui mais velho", mas exclui arquivos mais antigos que a cópia no destino diretório.

Claro, faça seus próprios testes como sempre.

Existe uma maneira estranha de fazer isso com xcopy:

echo nnnnnnnnnnn | xcopy /-y source target

Basta incluir tantos n's quanto os arquivos que você está copiando e eles responderão n a todas as perguntas sobrescrever.

robocopy src dst /MIR /XX

/Xx: exclua arquivos e dirs "extras" (presentes no destino, mas não origem). Isso impedirá qualquer deleção do destino. (este é o padrão)

Robocopy pode ser baixado aqui para sistemas onde ele não está instalado.(I. e.O Windows Server 2003.)

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (nenhum reinício necessário para instalação)

Lembre-se de definir o seu caminho para o robocopy exe.Você pode fazer isso clicando com o botão direito "meu computador"> propriedades>avançado>"Variáveis de Ambiente", em seguida, localize a variável de caminho do sistema e adicionar este fim:";C:\Program Files\Windows Resource Kits ools" ou onde quer que você instalou.Certifique-se de deixar a variável de caminho cadeias que já estão lá e só acrescentar o adicional de caminho.

uma vez que o caminho está definido, você pode executar o comando que a fronteira sugere.Ele funciona muito bem.

Não me permite comentar diretamente as mensagens incorretas - mas deixe -me avisar a todos, que a definição das opções /XN e /XO é revertida em comparação com o que foi publicado nas mensagens anteriores.

A opção Excluir arquivos mais antiga/mais recente é consistente com as informações exibidas no registro do Robocopy: o robocopy iterará através da fonte e depois relatará se cada arquivo na fonte é "mais antigo" ou "mais recente" que o arquivo no destino.

Consequentemente, /XO excluirá arquivos de origem mais antigos (que são intuitivos), não "mais antigos que a fonte", como havia sido reivindicado aqui.

Se você deseja copiar apenas arquivos de origem novos ou alterados, mas evite substituir os arquivos de destino mais recentes, /XO é a opção correta a ser usada.

Uma abordagem simples seria usar a opção /miR para refletir os dois diretórios. Basicamente, ele copiará apenas os novos arquivos para o destino. No próximo comand, substitua a fonte e o destino pelos caminhos para suas pastas, o script procurará qualquer arquivo com qualquer extensão.

robocopy <source directory> <destination directory> *.* /MIR

É isso que funcionou para mim. Eu uso isso para "adicionar" arquivos à outra unidade, sem substituição.

Arquivo em lote: robocopy-missingfiles.bat

@echo off
echo Copying 
echo      "%1"
echo   to "%2"
echo.
echo Press Cntr+C to abort
Pause
echo.
@echo on
robocopy %1 %2 /Xo /XN /XC /J /SL /S /MT:8 /R:1 /W:1 /V /DCOPY:DAT /ETA /COPY:DATO /FFT /A-:SH /XD $RECYCLE.BIN "System Volume Information"

Exemplo:

robocopy-missingfiles.bat f:\Working-folder\ E:\Backup-folder\

Teste antes da implementação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top