@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
информацией ( как пути и т. Д. ) о операции.
1-й аргумент метки :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
, переданный на xcopy
, отвечает на приглашение «файл или папка?» .
В конце сценария папка source
будет удалена, если она пуста.
Установите переменные source
, target
и overflow
в верхней части скрипта для фактических путей.
Просмотр set /?
о подстановке переменных, используемой в скрипте.Он используется для замены пути к исходному каталогу другим путем к каталогу, чтобы создать путь назначения.