如果文件存在,则将文件复制为另一名称

时间:2012-12-01 12:17:17

标签: batch-file cmd backup xcopy

我想将特定文件从pc复制到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和ect ..

是否可以这样做?

1 个答案:

答案 0 :(得分:2)

我将假设您的源名称为“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