windows - Batch oprette et sæt undermapper i flere mapper

Indlæg af Hanne Mølgaard Plasc

Problem



Mit mål er at oprette et sæt mapper med identiske undermapper. Jeg har brug for en mappe for hvert år siden 1881, hvert år mappe skal indeholde en mappe per måned, og hver måned mappe skal indeholde en mappe om dagen.


Jeg har fundet et værktøj til at oprette mapperne i årenes løb. Udfordringen er nu at fylde dem med undermapperne. Jeg vil gerne gøre dette på en Windows-klientcomputer, helst uden at installere noget.


Hvad jeg har arbejdet på, bruger FOR- og MD-kommandoerne til at udføre jobbet. Her er koden jeg har hidtil:


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


Når jeg kører dette, får jeg denne fejl:



  \% path\% var uventet på dette tidspunkt



Så det er her jeg er lige nu. Jeg værdsætter enhver hjælp, du kan give mig!

Bedste reference


Læs først HELP FOR og derefter til at begynde med noget, prøv dette på en kommandolinje


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


Nu er du allerede våd, tilføj noget krydderi


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


og du er næsten færdig


  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


Det eneste der er tilbage, er at omdanne din echo til den passende mkdir og tilføje noget incantation til at oversætte det til en BAT-fil ....


@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


men vær advaret, dette vil vokse ekstremt vildt!

Andre referencer 1


Undskyld P.A. Din løsning er korrekt, jeg kunne bare ikke modstå fristelsen til at tilføje nogle kodeord for at skabe det rigtige antal dage om måneden.


@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


Forrige kode tilføj 1 dag til februar i springår, det vil sige, hvis året er deleligt med 4, men kun i århundreder, hvis det også kan deles med 400. 1600 og 2000 var springår, men 1700, 1800 og 1900 var ikke .