如何通过批处理文件移动文件,但是如果文件已经存在,如何移动到其他地方?

时间:2018-09-23 01:03:15

标签: windows batch-file robocopy xcopy

我正在尝试将文件移动到特定文件夹 (目标文件夹),但我不想覆盖任何 文件。相反,如果文件已经存在于该特定文件中 文件夹(目标文件夹),然后将该文件移到另一个 文件夹(溢出文件夹),但保持文件夹结构。

我尝试使用xcopyrobocopy,但似乎 不能那样做。

这是我用来移动文件但不覆盖的脚本。

robocopy "C:\DummySourcePath\" "C:\DummyDestantionPath\" /E /XC /XN /XO

2 个答案:

答案 0 :(得分:1)

现在看来您的目标是获取一个文件夹或目录,并从该文件夹中获取所有内容(包括子目录中的内容)并将其复制到一个主文件夹中。您希望将任何重复的文件发送到溢出而不是被覆盖。

如果您不想覆盖任何文件,则溢出文件夹将起作用。但是,如果有两个重复的文件试图转储到溢出目录中怎么办?要解决此问题,我们可以简单地将 {文件} 命名为 {文件}(1) {文件}(2)。脚本的这一部分取自帖子michael_heath上的batch script to copy files listed in a txt document and keep duplicates

基本上,我们使用FOR /R语句和IF语句来检查 target 目录是否包含文件。如果是这样,ELSE会将其移至溢出状态,并提供进一步的反泛写保护。

@ECHO OFF
@setlocal enableextensions enabledelayedexpansion

rem | Configure directories
set "source=C:\Source-Directory"
set "target=C:\Target-Directory"
set "overflow=Overflow-Directory"

rem | Scan target directory for a duplicate file name.
rem | If a duplicate was found, run a function to copy it to a overflow directory.
rem | If it already exists in the overflow directory rename it to {Name}(1), {Name}(2), exc.
rem | The overflow {Name}(1) protection was originally scripted by: michael_heath
FOR /R "%source%" %%i in (*.*) do (
If not exist "%target%\%%~nxi" (copy "%%i" "%target%") ELSE (call :index "%%~i" "%overflow%\%%~nxi" "1"))

rem | Run finished code here or end script with "goto :eof"
goto :eof

:index  source, overflow, count
setlocal
set /a "cnt=%~3"

if exist "%overflow%\%~n2(%cnt%)%~x2" (
    call :index "%~1" "%~2" "%cnt%+1"
) else copy "%~1" "%overflow%\%~n2(%cnt%)%~x2"

答案 1 :(得分:1)

@echo off
setlocal

set "source=%cd%\source"
set "target=%cd%\target"
set "overflow=%cd%\overflow"

for /r "%source%" %%A in (*.*) do call :copyfile "%%~A" "move" "report"

2>nul rd "%source%"
exit /b

:copyfile  source [, operation [, report]]
setlocal
set "curpath=%~1"
set "operation=%~2"
set "report=%~3"

if defined report echo "%curpath%"

call set "destpath=%%curpath:%source%=%target%%%"
if exist "%destpath%" call set "destpath=%%curpath:%source%=%overflow%%%"

if exist "%destpath%" (
    if defined report echo     exist in "%destpath%"
    exit /b 1
)

if "%operation%" == "copy" (
    if defined report echo     copy to "%destpath%"
    echo f|>nul xcopy "%curpath%" "%destpath%"
) else (
    for %%A in ("%destpath%") do (
        if not exist "%%~dpA" md "%%~dpA" || (
            if defined report echo     md failed with "%%~dpA"
            exit /b 1
        )
    )

    if defined report (
        echo     move to "%destpath%"
        move "%curpath%" "%destpath%"
    ) else >nul move "%curpath%" "%destpath%"

    for %%A in ("%curpath%") do 2>nul rd "%%~dpA"
)
exit /b 0
在同一分区上的

move是 仅主文件表。 move到不同的分区是实际的 copy上的deletecopycopy总是copy

我实现了这两种操作,并且可以由 :copyfile的被叫标签的第二个可选参数 通过传递"move""copy"。 如果参数不是"move",则默认为"copy"

标签:copyfile的第三个可选参数 是输出进度报告。 如果定义了此参数,将echo信息 (有关操作的路径等。)。

标签:copyfile的第一个参数是 要复制或移动的文件的路径。

for /r循环递归source目录,然后 使用找到的每个文件的路径调用:copyfile:copyfile会将curpath设置为source文件,然后 将destpath设置为target的路径,即 source路径替换为target路径。 如果存在destpath,则将destpath设置为路径 到overflow,这是替换的source路径 overflow路径。如果destpath仍然存在,则 标签已退出。

move操作使用rd删除空文件夹 来自source

copy操作使用xcopy,因为它使 目标文件夹结构,因此不使用md。 输送到echo f的{​​{1}}是为了回答“文件 还是文件夹?” 提示。

脚本结束时,xcopy文件夹将被删除 如果为空。

设置sourcesourcetarget变量 脚本顶部的实际路径。

查看overflow有关在 剧本。用于替换源 目录路径与另一个目录路径, 创建目标路径。