Автоматически копировать файлы без перезаписи, а вместо этого создавать нумерованные

Мне нужно копировать файлы через регулярный интервал, например, один раз в час, поэтому я попытался настроить пакет xcopy, заявив, что он должен копировать файлы, которые необходимо скопировать в другую папку. Теперь, когда он копирует, он перезаписывает файлы, а это не то, что он должен делать.

Когда файл копируется, он должен вместо этого создать новый файл с именем вроде File.txt, File-COPY1.txt, File-COPY2.txt или что-то в этом роде.

Как это сделать?

Заранее спасибо.


person Robin van Dijk    schedule 21.09.2012    source источник


Ответы (4)


Вы можете создавать отдельные файлы для каждого запуска, просто добавляя отметку времени к имени файла. Что-то вроде этого:

XCOPY "File.txt" "[TargetDir]\File1_%time:~0,2%_%time:~3,2%_%time:~6,2%.txt"

Это преобразуется в имя файла, которое читается как File1_11_30_05.txt, учитывая, что операция копирования выполняется в 11:30:05. Часть %time:~0,2% извлекает 2 цифры из строки времени, хранящейся в переменной %time%.

Кроме того, таким же образом можно добавить дату. Для этого можно использовать переменную %date%.

Если вам действительно нужен шаблон типа File-COPY1.txt, File-COPY2.txt и т. Д., Это требует немного дополнительной работы. Сообщите нам, если подход с отметкой времени недостаточен.

person Frank Bollack    schedule 21.09.2012

Этот пакет берет имя двух каталогов, относительное или явное, и копирует все файлы из первого каталога во второй каталог, но добавляет - # между именем файла и расширением (где # - количество копий файла в второй каталог). Итак, если есть только один файл (MISC.txt), скопированный из dir1 в dir2, но он был скопирован 4 раза, dir2 будет содержать 4 файла: (MISC-1.txt MISC-2.txt MISC-3.txt и MISC-4.txt)

Чтобы использовать zcopy.bat, назовите это так zcopy fromDir toDir

zcopy.bat

@echo off
if "%1"=="" goto :eof
if "%1"=="/?" type %~dpnx0 & goto :eof
if "%2"=="" goto :eof
if not exist %2 md %2
setlocal enableDelayedExpansion
for %%x in (%1\*.*) do (
  set this=
  set count=1
  if "%%~xx"=="" (
    set backstop=.
  ) else (
    set backstop=
  )
  for /f %%y in ('dir /b /a:-d /o:n "%2\%%~nx-*%%~xx!backstop!" 2^>nul') do ( 
    set this=%%~nxy
  )
  if not "!this!"=="" (
    set count=!this:%%~nx-=!
    if "%%~xx"=="" (
      set /a count=!count!+1
    ) else (
      set /a count=!count:%%~xx=! + 1
    )
  )
  set target=%%~nx-!count!%%~xx
  echo copy "%%x" "%2\!target!"
  copy "%%x" "%2\!target!" > nul 2>&1
)

Если каталог %2 не существует, приведенный выше код создаст его.

person James K    schedule 22.09.2012
comment
Не пытаюсь показаться глупым или что-то в этом роде, но мне нужно заменить% 1 начальным каталогом и% 2 местом назначения? А что мне указать в остальных параметрах? Спасибо :) - person Robin van Dijk; 25.09.2012
comment
@ user1688322 - Нет, код редактировать не нужно. % 1,% 2% 3 и т. Д. Являются встроенными заполнителями для аргументов, передаваемых в ваш пакетный файл. Итак, если вы введете zcopy fromDir toDir, тогда %1 == fromDir и %2 == toDir, а %3 останется пустым. - person James K; 25.09.2012

Я использую это для ежедневного резервного копирования файлов.

    set aa=%date:~4,2%%date:~7,2%%date:~12,2%
    copy filename.txt c:\backupfolder\filename%aa%.txt

Надеюсь, это кому-то поможет. Скотт ....

person Scott    schedule 26.09.2012

повторяет имя файла, т.е. каждый раз дает новое имя. вы можете просто добавлять числовые числа.
использовать один счетчик, каждый раз увеличивая его, и увеличивающийся счетчик объединяется с именем файла

person Ravindra Bagale    schedule 21.09.2012