Я хочу переименовать несколько папок и держать все файлы и подкаталоги в такте.
Пакетные команды Windows, такие как xcopy и move не могут обрабатывать все случаи *.

Я установил два столбца со старыми и новыми путями.

OLD PATH            NEW PATH
C:\dir1\dir3\dir7   C:\a1\a2\a3      
C:\dir1\dir4\dir8   C:\b1\b2\b3      
C:\dir2\dir5\dir9   C:\c1\c2\c3      
...
C:\dir2\dir6\dir0   C:\d1\d2\d3      

Сложности: необходимо переименовать несколько папок в строке; последние перечисленные папки, такие как dir7 могут иметь несколько подкаталогов; метки времени файла не должны быть изменены


* xcopy не может двигаться, он только копирует. Это проблема, если у вас недостаточно места для копирования и удаления больших данных.
Команда move не перемещает подкаталоги, только файлы

1 ответ1

1

Самая простая (простая) версия пакетного файла будет выглядеть так:

call :robo "C:\dir1\dir3\dir7"   "C:\a1\a2\a3"
call :robo "C:\dir1\dir4\dir8"   "C:\b1\b2\b3"
call :robo "C:\dir2\dir5\dir9"   "C:\c1\c2\c3"
echo etc...
call :robo "C:\dir2\dir6\dir0"   "C:\d1\d2\d3"
goto:eof

:robo
robocopy %1 %2 /MOVE /E
goto:eof

Вам нужно будет процитировать каталоги, если в них есть пробелы.

Для чтения каталогов из файла вы должны сделать это:

directories.txt:

C:\dir1\dir3\dir7,C:\a1\a2\a3
C:\dir1\dir4\dir8,C:\b1\b2\b3
C:\dir2\dir5\dir9,C:\c1\c2\c3
C:\dir2\dir6\dir0,C:\d1\d2\d3

Нет необходимости в кавычках и разделяйте их запятой. Затем в пакетном файле:

FOR /F "tokens=1-2* delims=," %%A IN (directories.txt) DO (
  robocopy "%%A" "%%B" /MOVE /E
)

Также здесь ... если вы хотите посмотреть, что делает robocopy, сначала используйте /L

Если у вас есть такой файл (с пробелами для выравнивания первого и второго столбца), вам нужно добавить код, чтобы убрать начальные и конечные пробелы из каталогов:

Снова directories.txt:

C:\dir1\dir3\dir7\sada\asda ,  C:\a1\a2\a3
C:\dir1\dir4\dir8           ,  C:\b1\b2\b3
C:\dir2\dir5\dir9           ,  C:\c1\c2\c3
...
C:\dir2\dir6\dir0           , C:\d1\d2\d3

И это как пакетный файл:

@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=1-2* delims=," %%A IN (directories.txt) DO (
  call :trim dir1 %%A
  call :trim dir2 %%B
  robocopy "!dir1!" "!dir2!" /MOVE /E
)
goto:eof

:trim
set trimmed=%2
for /f "tokens=* delims= " %%c in ("%trimmed%") do set trimmed=%%c
for /l %%c in (1,1,100) do if "!trimmed:~-1!"==" " set trimmed=!trimmed:~0,-1!
set "%~1=%trimmed%"
goto:eof

Примечание. Не выполняется проверка ошибок, чтобы определить, действительно ли существуют каталоги или заполнен только один столбец ... и т.д.
(но, конечно, это может быть добавлено).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .