Скопировать файл под другим именем, если файл существует

Я хочу скопировать определенный файл с компьютера на USB

мой код:

  xcopy /H /Y /C /R "C:\image1.jpeg" "G:\backup\image.jpeg"

я хочу сделать следующее: если G:\backup\image1.jpeg существует, скопируйте image.jpeg как image2.jpeg (или как другое имя),

если существует image2.jpeg, скопируйте его как image3.jpeg и т. д.

Можно ли сделать это?


person GM12221222    schedule 01.12.2012    source источник
comment
Вы действительно имели в виду xcopy /H /Y /C /R "C:\image.jpeg" "G:\backup\image1.jpeg"? Ваш вопрос не совсем понятен в том виде, в котором он написан.   -  person dbenham    schedule 01.12.2012


Ответы (1)


Я предполагаю, что ваше исходное имя — «image.jpeg», а место назначения имеет добавленный суффикс.

Я рекомендую ставить точку перед добавленным суффиксом, чтобы было понятно, где заканчивается исходное имя и начинается суффикс. Ваше исходное имя уже могло иметь число в конце.

Вот грубый, но очень эффективный метод перебора, который поддерживает до 100 копий. Очевидно, что верхний предел может быть легко увеличен.

call :backup "c:\image.jpeg"
exit /b

:backup
for /l %%N in (1 1 100) do (
  if not exist "G:\backup\%~n1.%%N.%~x1" (
    echo F|xcopy %1 "G:\backup\%~n1.%%N.%~x1" >nul
  )
  exit /b
)

Но есть потенциальная проблема. Предположим, что image.1.txt и image.2.txt уже существуют, но затем вы удаляете image.1.txt. При следующем резервном копировании будет воссоздан image.1.txt, и тогда вы можете подумать, что image.2.txt — это самая последняя резервная копия.

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

@echo off
call :backup "c:\image.jpeg"
exit /b

:backup
setlocal disableDelayedExpansion
set /a n=0
for /f "eol=: delims=" %%A in (
  'dir /b "g:\backup\%~n1.*%~x1"^|findstr /rec:"\.[0-9][0-9]*\%~x1"'
) do for %%B in ("%%~nA") do (
  setlocal enableDelayedExpansion
  set "n2=%%~xB"
  set "n2=!n2:~1!"
    if !n2! gtr !n! (
    for %%N in (!n2!) do (
      endlocal
      set "n=%%N"
    )
  ) else endlocal
)
set /a n+=1
echo F|xcopy %1 "g:\backup\%~n1.%n%%~x1" >nul
person dbenham    schedule 01.12.2012