Я использую Windows 8, и мне было интересно, возможно ли объединить папки, содержащие файлы с одинаковыми именами, но вместо того, чтобы перезаписывать их, меняя имя.

Например:

Folder A, with files 01, 02, and 03  
Folder B, with files 01, 02, and 03

Я хочу, чтобы результат был

Folder C (or any name) with:
   Files 01(A01), 02(A02), 03(A03), 04(B01), 05(B02) and 06(B03)

Все это файлы, которые были в папках A и B, а также следящие за тем же порядком.

1 ответ1

0

Используйте следующий скрипт (командный файл):

@echo off
setlocal enabledelayedexpansion

set counter=1000

set target=c

for %%S in (a b) do (
        for /f "delims=" %%F in ('dir %%S /b/a-d/one') do (
                set /a counter=counter+1
                move %%S\"%%F" %target%\"%%~xF"
        )
)

Заметки:

  • setlocal enabledelayedexpansion включает специальную обработку переменных в циклах.
  • for %%S in (a b) do … выполняет следующую группу операторов один раз для каждого значения в скобках, с %%S установленным в значение.  Я выбрал букву S для этого , потому что они являются s Ource каталоги.  Вы можете поместить столько исходных каталогов между скобками, сколько захотите.
  • for /f "delims=" %%F in ('…') do … выполняет следующую группу операторов один раз для каждой строки вывода команды в кавычках '…' , с %%F установленным в строку.  Я выбрал букву F для этого , потому что эти имена Ile ф.
  • dir %%S /b/a-d/one дает a b (без заголовка, даты, размеров и т. д.) список файлов в исходном каталоге %%S /a-d означает только файлы списка (без каталогов); /one означает уплотнительный rder (сортировки) запись по п AME и расширению е.
  • set /a counter=counter+1 не требует пояснений.
  • Таким образом , в конце концов мы выполняем команду move перемещение файла %%F из каталога источника %%S в целевой каталог.   !counter:~1! является формой %variable:~start,length% синтаксиса, переводит подстроку переменной counter от второго символа (потому что первый символ # 0) до конца.  Таким образом, если counter шагает по значениям 1001, 1002, 1003,…, тогда эта подстрока равна 001, 002, 003 и т.д. Если вы уверены, что у вас меньше 100 файлов, вы можете изменить инициализацию counter на 100 ,  И %%~xF является расширением имени файла %%F

Это перемещает все файлы в каталогах a и b .  Если вы хотите получить все в деревьях каталогов a и b , измените внутренний цикл на

        for /f "delims=" %%F in ('dir %%S /b/a-d/one/s') do (
                set /a counter=counter+1
                move "%%F" %target%\"!counter:~1!%%~xF"
        )
  • Добавление /s к команде dir делает ее рекурсивной.
  • В то время как dir directory_name /b дает вам только имена файлов, dir directory_name /b/s дает вам полные пути, поэтому команда move не должна включать в себя %%S исходный каталог.

Больше примечаний:

  • Это будет обрабатывать имена файлов с пробелами в них.
  • Это будет обрабатывать имена каталогов с пробелами в них - просто заключите их в кавычки:

    set target="c food"
    
    for %%S in ("a train" "b good") do (
                    ︙
    

Конечно, вы должны сначала проверить это с измененным move на echo move .

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