发生名称冲突时重置文件的批处理文件

时间:2016-04-29 03:04:43

标签: windows batch-file

我是创建.bat文件的新手。我正在尝试创建一个批处理文件,将文件从一个目录移动或复制到另一个目录,如果文件存在于目标目录中,它将使用(1)重命名该文件。下面是我要复制的.bat文件,但它会覆盖目标目录中的文件。

    copy /-y "C:\Users\Private\Desktop\Move-Copy\1\1.txt" "C:\Users\Private\Desktop\Move-Copy\2"
    pause

1 个答案:

答案 0 :(得分:0)

以下脚本提供了一个子例程:SUB_COPY,它可以执行您想要的操作,即复制文件而不覆盖现有文件,但会生成新的唯一名称。例程需要两个命令行参数:第一个是源项的路径(支持通配符?*;也允许目录),第二个是路径到目标(目标)目录。所以这是脚本:

@echo off
call :SUB_COPY "C:\Users\Private\Desktop\Move-Copy\1\1.txt" "TARGET=C:\Users\Private\Desktop\Move-Copy\2"
exit /B


:SUB_COPY source_item target_dir
if not "%~3"=="" (
    >&2 echo ERROR: too many arguments!
)
set "SOURCE=%~f1"
if not defined SOURCE (
    >&2 echo ERROR: missing argument!
    exit /B 1
) else if not exist "%SOURCE%" (
    >&2 echo ERROR: source not found!
    exit /B 1
)
set "TARGET=%~f2"
if not defined TARGET set "TARGET=."

for /F "delims=" %%I in ('
    2^> nul xcopy /L /Y /I "%SOURCE%" "%TEMP%\" ^| findstr /V /R "^[0-9]"
') do (
    call :SUB_DO "%%~I" "%TARGET%"
)
exit /B

:SUB_DO source_file target_dir
set "SUFFIX="
:CHECK
if exist "%~f2\%~n1%SUFFIX%%~x1" (
    set /A SUFFIX-=1
) else (
    2> nul md "%~f2"
    > nul 2>&1 copy /B "%~f1" "%~f2\%~n1%SUFFIX%%~x1" && (
        echo INFO: copied "%~nx1" as "%~n1%SUFFIX%%~x1".
    ) || (
        >&2 echo ERROR: copying of "%~nx1" failed!
        exit /B 1
    )
    exit /B
)
goto :CHECK

首先,子例程:SUB_COPY检查提供的参数是否有效。之后有一个for /F循环枚举源项,所以要解析目录和通配符?*以防万一(此循环解析xcopy /L的输出,只是为了解析源并返回单个文件(非递归); /L告诉不复制任何内容,只列出文件)。在这个循环内部,调用另一个子例程:SUB_DO,它复制单个文件;此例程检查目标目录中是否存在具有相同名称的文件,如果存在,则将后缀-1附加到文件名;然后重复检查,如果仍然找到文件,则后缀变为-2,依此类推,直到找到新的文件名,这在目标目录中不会发生,因此复制实际上是进行。