@echo off
setlocal
if "%~1" == "test" call :test
for /d /r %%F in (*) do (
for /d %%G in ("%%F\*") do (
for %%H in ("%%~G\*.EXT") do (
call :move "%%~H" "%%~F"
)
)
)
exit /b
:move
setlocal
if /i not exist "%~2\%~nx1" (
echo 1. move "%~1" "%~2"
move "%~1" "%~2"
exit /b
)
set "name=%~n1"
for /l %%I in (1 1 9) do (
if "%name:~-4%" == " (%%I)" (
set "name=%name:~0,-4%"
)
)
for /l %%I in (1 1 9) do (
if not exist "%~2\%name% (%%I)%~x1" (
echo 2. move "%~1" "%~2\%name% (%%I)%~x1"
move "%~1" "%~2\%name% (%%I)%~x1"
exit /b
)
)
exit /b
:test
if exist "Main Folder" rd /s /q "Main Folder"
call :prep "Main Folder\Folder2\Folder3a" "File1.EXT"
call :prep "Main Folder\Folder2\Folder3b" "File2.EXT"
call :prep "Main Folder\Folder2\Folder3c" "File3.EXT"
call :prep "Main Folder\Folder2\Folder3d" "File1.EXT"
call :prep "Main Folder\Folder3\Folder3a" "File1.EXT"
call :prep "Main Folder\Folder3\Folder3b" "File2.EXT"
call :prep "Main Folder\Folder3\Folder3c" "File3.EXT"
call :prep "Main Folder\Folder3\Folder3d" "File1.EXT"
pushd "Main Folder" || exit /b 1
echo Prepared to test.
pause
exit /b
:prep
if /i not exist "%~1" md "%~1"
if /i not exist "%~1\%~2" type nul > "%~1\%~2"
exit /b
Интегрированный тестовый код упрощает тестирование. Удалите тестовый код, если хотите. Протестируйте, используя test
в качестве 1-го аргумента, т.е. main.cmd test
.
На основе цикла, который вы разместили в Как создать пакетный файл, который перемещает файлы из подпапки вверх на один уровень, переименовывая дубликаты? Цикл дает вам путь к целевому файлу и путь к целевому каталогу.
Метка :move
вызывается с каждым циклом цикла, и 1-й определяет, не существует ли целевой файл. Если не существует, делает перемещение и выходит из метки. Если существует, использует другой цикл для обнаружения и обрезает имя файла, если оно заканчивается на (N)
, где N
— число от 1 до 9. Затем он входит в другой цикл для перемещения с именем файла назначения с 1-м доступным (N)
, добавленным к имени.
Проверено в корне D:\
. Вывод, который я получаю:
D:\> main.cmd test
Prepared to test.
Press any key to continue . . .
1. move "D:\Main Folder\Folder2\Folder3a\File1.EXT" "D:\Main Folder\Folder2"
1 file(s) moved.
1. move "D:\Main Folder\Folder2\Folder3b\File2.EXT" "D:\Main Folder\Folder2"
1 file(s) moved.
1. move "D:\Main Folder\Folder2\Folder3c\File3.EXT" "D:\Main Folder\Folder2"
1 file(s) moved.
2. move "D:\Main Folder\Folder2\Folder3d\File1.EXT" "D:\Main Folder\Folder2\File1 (1).EXT"
1 file(s) moved.
1. move "D:\Main Folder\Folder3\Folder3a\File1.EXT" "D:\Main Folder\Folder3"
1 file(s) moved.
1. move "D:\Main Folder\Folder3\Folder3b\File2.EXT" "D:\Main Folder\Folder3"
1 file(s) moved.
1. move "D:\Main Folder\Folder3\Folder3c\File3.EXT" "D:\Main Folder\Folder3"
1 file(s) moved.
2. move "D:\Main Folder\Folder3\Folder3d\File1.EXT" "D:\Main Folder\Folder3\File1 (1).EXT"
1 file(s) moved.
Как видно, 2 файла перемещаются с добавлением (1)
к имени файла. Это строки, начинающиеся с 2.
. Строки, начинающиеся с 1.
, перемещены с неизмененными именами файлов.
person
michael_heath
schedule
09.04.2018
[batch-file]
в начале строки поиска, вы сможете сузить результаты до этого конкретного языка сценариев. - person Compo   schedule 08.04.2018