nimrodi
Goto Top

Automatisch Ordner und Unterordner anlegen mit historischem Datum (Schaltjahre berücksichtigen)

Hallo zusammen,

ich möchte in einem Zielverzeichnis eine bestimmte Ordnerstruktur mit Unterordnern anlegen, die ein fortlaufendes historisches Datum tragen sollen. Die Struktur soll wie folgt aussehen:

...Zielverzeichnis\Jahr\Jahr_Monat_Tag\
also
...Zielverzeichnis\1951\1951_01_01\

Es gibt zwar unzählige Beschreibungen wie man Ordner mit aktuellem Datum anlegt, aber für historische Daten konnte ich keine brauchbare Beschreibung finden.
Im Idealfall möchte ich in der Batch Datei nur das Startjahr und das Endjahr eingeben müssen. An sich wäre das überhaupt kein Problem für mich, gäbe es keine Schaltjahre.

Gibt es da eine Möglichkeit beim Anlegen der "Tagesordner" den Kalender zu berücksichtigen oder muss ich die ganzen Schaltjahressonderfälle in die Schleifen einbauen?

Besten Dank schonmal!
Nimrodi

Content-Key: 269735

Url: https://administrator.de/contentid/269735

Printed on: April 26, 2024 at 10:04 o'clock

Mitglied: 114757
114757 Apr 20, 2015 updated at 19:14:24 (UTC)
Goto Top
Moin,
mit Powershell schnell gemacht face-wink
$folder = 'c:\ordner'  
[int]$start = read-Host "Startjahr eingeben"  
[int]$end = read-Host "Endjahr eingeben"  
($start)..($end) | %{
    md "$folder\$_"  
    $d = get-date "01.01.$_"  
    while($d -lt (get-date "01.01.$_").AddYears(1)){  
       md "$folder\$_\$($d.toString('yyyy\_MM\_dd'))"  
       $d = $d.AddDays(1)
    }
}
Gruß jodel32
Member: rubberman
Solution rubberman Apr 20, 2015, updated at Jul 21, 2015 at 16:28:34 (UTC)
Goto Top
Hallo Nimrodi, willkommen im Forum.

Auch mit Batch ist das machbar, allerdings etwas komplizierter.
@echo off &setlocal
set "dest=Zielverzeichnis"  

set /p "ys=Startjahr: "  
set /p "ye=Endjahr:   "  

setlocal EnableDelayedExpansion
for /l %%i in (!ys! 1 !ye!) do (
  for /l %%j in (101 1 112) do (
    set "m=%%j"  
    call :DaysInMonth %%i !m:~-2!
    set /a "d = 100+!errorlevel!"  
    for /l %%k in (101 1 !d!) do (
      set "d=%%k"  
      ECHO md !dest!\%%i\%%i_!m:~-2!_!d:~-2!
    )
  )
)
PAUSE
exit /b

:DaysInMonth YY MM
setlocal DisableDelayedExpansion
set /a "YY = %~1, MM = 100%~2 %% 100"  
set /a "n = 30+!(((MM&9)+6) %% 7)+!(MM^2)*(!(YY %% 4)-!(YY %% 100)+!(YY %% 400)-2)"  
endlocal &exit /b %n%
ECHO und PAUSE kannst du rausschmeißen, um den Code scharf zu schalten.

Grüße
rubberman

EDIT Zeile 15 korrigiert, siehe unten ...
Member: Nimrodi
Nimrodi Jul 21, 2015 at 11:52:14 (UTC)
Goto Top
Hi rubberman,

sorry fürs späte antworten. Deine Version funktioniert. In der ersten for-Schleife fehlt nur "set y=%%i", dann passts. Die Version mit Powershell von jodel32 habe ich nicht probiert.
Member: rubberman
rubberman Jul 21, 2015 at 16:24:46 (UTC)
Goto Top
Hallo Nimrodi.

In der ersten for-Schleife fehlt nur "set y=%%i"
Da hast du natürlich Recht, sorry. Ebenso kann man aber die Variable y ganz in die Tonne treten und gleich mit der FOR Variablen %%i arbeiten. Ich ändere oben mal entsprechend.

Grüße
rubberman