2012-03-06 3 views
0

Моя цель - создать набор папок с идентичными вложенными папками. Мне нужна одна папка на каждый год с 1881 года, каждый год-папка должна содержать папку в месяц, а каждый месяц-папка должна содержать папку в день.Пакетное создание набора подпапок в нескольких папках

Я нашел инструмент для создания папок на годы, теперь моя задача - заполнить их вложенными папками. Я хочу сделать это на клиентском компьютере Windows, желательно, не устанавливая ничего.

Что я работаю, использует команды FOR и MD для выполнения этой задачи. Вот код, который я до сих пор:

SET %g=*.* 
FOR /d %var IN %path% DO MKDIR 01 02 03 

Всякий раз, когда я запускаю это, я получаю эту ошибку:

%path% was unexpected at this time

Итак, вот где я stuch прямо сейчас. Буду признателен за любую помощь, которую вы можете мне дать!

ответ

3

первый, читайте HELP FOR, а затем начать с чем-то, попробуйте это в командной строке

for /l %a in (1881,1,2012) do @echo %a 

теперь вы мокрая уже, добавить специи

for /l %a in (1881,1,2012) do @for /l %b in (1,1,12) do @echo %a-%b 

и вы почти сделано

for /l %a in (1881,1,2012) do @for /l %b in (1,1,12) do @for /l %c in (1,1,31) do @echo %a-%b-%c 

Осталось только преобразовать echo в наши правила mkdir и добавив некоторые колдовство, чтобы перевести его в файл BAT ....

@echo off 
pushd d:\dest 
for /l %%a in (1881,1,2012) do (
    mkdir %%a 
    pushd %%a 
    for /l %%b in (1,1,12) do (
    mkdir %%b 
    pushd %%b 
    for /l %%c in (1,1,31) do (
     mkdir %%c 
    ) 
    popd 
) 
    popd 
) 
popd 

, но имейте в виду, это будет расти чрезвычайно ума!

+0

+1, но он всегда создает 31-дневные папки в каждом месяце ... – Aacini

+0

Нет необходимости в pushd/popd и mkdir, только в цикле внутри самой: 'mkdir d: \ dest \ %% a \ %% b \ %% c' – dbenham

6

Извините. P.A. Ваше решение правильно, я просто не мог удержаться от соблазна добавить код для создания правильного количества дней в месяц.

@echo off 
setlocal EnableDelayedExpansion 
set m=0 
for %%d in (31 28 31 30 31 30 31 31 30 31 30 31) do (
    set /A m+=1 
    set daysInMonth[!m!]=%%d 
) 
pushd d:\dest 
for /L %%y in (1881,1,2012) do (
    mkdir %%y 
    pushd %%y 
    for /L %%m in (1,1,12) do (
     mkdir %%m 
     pushd %%m 
     set days=!daysInMonth[%%m]! 
     if %%m == 2 (
     set /A yMod4=%%y %% 4, yMod100=%%y %% 100, yMod400=%%y %% 400 
     if !yMod4! == 0 (
      set /A days+=1 
      if !yMod100! == 0 if not !yMod400! == 0 (
       set /A days-=1 
      ) 
     ) 
    ) 
     for /L %%d in (1,1,!days!) do (
     mkdir %%d 
    ) 
     popd 
    ) 
    popd 
) 
popd 

Предыдущий код добавить 1 день февраля високосного года, то есть, если год делится на 4, но в вековых лет, только если оно делится на 400. 1600 и 2000 были високосными годами, но 1700, 1800 и 1900 гг.

+0

+1 для правильного ответа _always_, но вы можете предположить, что один из ваших исключений високосного года будет использоваться? – jeb

+0

@jeb: Ну, OP требует создания папок года для 1900 и 2000 годов. Также подумайте об этом: Пакетные файлы были изобретены более 30 лет назад, и мы здесь используем их! Итак, кто знает для 2100? :) – Aacini

+0

+1 лучше, чем у меня! –

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