2012-02-12 2 views
0

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

У меня это как свинец: http://www.pcreview.co.uk/forums/can-copy-file-multiple-folders-t1959548.html

и этого ... https://stackoverflow.com/questions/1...in-a-directory

И я попытался это:

@ECHO OFF 
CLS 
PAUSE 
FOR /R %%A in (C:\Users\Liam\Desktop\Master) DO ( 
COPY %%A C:\Users\Liam\Desktop\Master\Master-Copies\ 
GOTO :Exit 
) 
:Exit 
Pause 

Паузы присутствуют, потому что я Я пытаюсь выяснить, что именно происходит.

В моей директории «Мастер» имеется около 250 подкаталогов. Я хотел бы скопировать один файл из каждого подкаталога и поместить его в новый подкаталог под названием «Master-Copies», который должен содержать 250 файлов. В подкаталогах и файлах нет имен в именах, однако я хотел бы создать эту функциональность в пакетном файле, если я снова столкнулся с этой ситуацией. Я хотел бы скопировать первый файл в каждый подкаталог. Я знаю из чтения других форумов, что файл «FIRST» относителен, но я бы хотел, чтобы это был первый файл, отсортированный по имени.

Я знаю, что я много прошу, и, надеюсь, какой-то гений здесь может помочь новому ребенку в программировании.

ответ

1

Задача 1 - вы пропускаете опцию/R. Корневой каталог должен следовать за параметром/R, и фильтр файлов должен появиться в предложении IN(). Прочтите помощь FOR, набрав FOR /? из командной строки.

Задача 2 - ваш цикл будет прерван после первого GOTO, поэтому максимально скопируйте файл из одного каталога.

Проблема 3 - вам нужно пропустить каталог назначения, так как это подкаталог вашего корня.

Решение: вам понадобятся две петли, первая - иерархия каталогов, начиная с вашего корня, и 2-й цикл, чтобы перечислить файлы в одном каталоге. Вам нужно будет ВЫХОД/В или GOTO из 2-го цикла после копирования 1-го файла, но это не сработает, если 2-й цикл встроен в 1-й цикл - выход/goto выйдет из внешнего большинства циклов.

Чтобы обойти эту проблему, вам необходимо, чтобы 1-й цикл вызывал подпрограмму, содержащую 2-й цикл. Затем вы можете вывести EXIT/B из 2-го цикла, и он вернется в ваш 1-й цикл и заберет там, где он остановился. Вызывайте только подпрограмму, если каталог не соответствует вашему целевому каталогу.

@echo off 
setlocal 
set root="C:\Users\Liam\Desktop\Master" 
set dest="C:\Users\Liam\Desktop\Master\Master-Copies\" 
for /r /d %root% %%D in (*) do if "%%D" neq %dest% call :copyFirstFile "%%D" 
pause 
exit /b 

:copyFirstFile 
for %%F in ("%~1\*") do (
    copy "%%F" %dest% 
    exit /b 
) 
+0

Thank you dbenham! Есть ли вероятность, что вы можете нанести новый удар по поводу перезаписываемых файлов? – user1205701

+0

@ user1205701 Если этот ответ помог вам, вы должны принять его и дать ему преимущество. – aphoria

Смежные вопросы