@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"。
如果参数不是"copy",则"move" 是默认值。
标签: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。
传送到xcopy 的echo f 是回答"文件
还是文件夹?” 提示。
在脚本结束时,source 文件夹将被删除
如果为空。
设置source、target和overflow变量
位于脚本顶部的实际路径。
查看set /? 中使用的变量替换
剧本。它用于替换源
目录路径与另一个目录路径,
创建目标路径。