Скопировать 1 файл из нескольких подкаталогов в другой каталог - PullRequest
0 голосов
/ 13 февраля 2012

Я искал в Google и на форумах несколько дней, пытаясь выяснить, как выполнить создание командного файла, который будет анализировать дерево каталогов и копировать 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

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

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

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

1 Ответ

1 голос
/ 13 февраля 2012

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

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

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

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

Чтобы обойти проблему, вам нужно, чтобы 1-й цикл вызывал подпрограмму, которая содержит 2-й цикл. Затем вы можете выйти / 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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...