我正在尝试将文件移动到特定文件夹 (目标文件夹),但我不想覆盖任何 文件。相反,如果文件已经存在于该特定文件中 文件夹(目标文件夹),然后将该文件移到另一个 文件夹(溢出文件夹),但保持文件夹结构。
我尝试使用xcopy
和robocopy
,但似乎
不能那样做。
这是我用来移动文件但不覆盖的脚本。
robocopy "C:\DummySourcePath\" "C:\DummyDestantionPath\" /E /XC /XN /XO
答案 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
上的delete
和copy
。
copy
总是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
文件夹将被删除
如果为空。
设置source
,source
和target
变量
脚本顶部的实际路径。
查看overflow
有关在
剧本。用于替换源
目录路径与另一个目录路径,
创建目标路径。