Btach Programmierung Ordner nach Datum bennenen

Hallo zusammen,

ich hab da ein kleines Problemchen.

Ich mache monatlich wiederkehrende Auswertungen, bei denen über Excel VBA Dateien ausgegeben werden. Nun möchte ich über einen shell-Befehl eine Batch-Datei einbinden, die die Dateien automatisch in einen Ordner verschiebt.

Das bedeutet, ich will die Dateien historisch archivieren und möchte, dass per Batch Datei ein Ordner angelegt wird, der allerdings nach dem aktuellen Monat und Jahr benannt ist.

Ist das möglich?

Vielen Dank im Voraus.
Gruß
Pascal

Batch Datei rechnen mit Datum??
Hallo,
nachdem ich nun geschafft habe, einen Ordner zu erstellen und ihn nach datum zu benennen

mkdir "c:…%date:~6,2%%date:~9,4%"

stellt sich mir nun das nächste Problem:
Es handels sich um monatlich wiederkehrende Auswertungen, die aktuell zwar im August erstellt wurden, jedoch unter dem Monat Juli abgelegt werden sollen.

Ich suche nun eine Möglichkeit, das Datum jeweils um einen MOnat zurückzurechnen.

Habe mir schon überlegt Variablen for Monat und Jahr zu setzen und diese dann im Dateinamen zusammenzusetzen, nachdem ich den Monat um 1 reduziert habe.

Allerdings habe ich das noch nicht hinbekommen.

Außerdem würde ich mit dieser Methode Probleme beim Jahreswechsel bekommen.
–> 002008

Vielleicht hat ja schon mal jemand Erfahrungen damit gesammelt, oder kann mir weiterhelfen?!

Viele Grüße
Pascal

Hallo Pascal,

wie wäre es hiermit?------ SCHNIPP: mycopy.bat ------
@echo off
setlocal
REM Hauptzielpfad setzen (inkl. abschliessendem )
set dest=c:…dest…\
REM Hauptquellfad setzen (inkl. abschliessendem )
set srcp=c:…source…\
REM Quelldateien (wenn Eintrag mit . beginnt, dann eigtl. *., ansonsten genau die angegebene Datei.)
set sdta=.xls .dat def.doc
REM Name des Unterverzeichnisses erstellen
REM Format von %date% ist „tt.mm.jjjj“
set mon=%date:~3,2%
if 0 EQU %mon:~0,1% set mon=%mon:~-1%
set /a mon=%mon%-1
if 0 EQU %mon% set mon=12
if 10 GTR %mon% set mon=0%mon%
set sub=%date:~6,4%-%mon%
REM Verzeichnis erstellen
mkdir %dest%%sub%
REM Daten kopieren
for %%d in ( %sdta% ) do call :docopy %%d
endlocal
exit /b 0:docopy
set xx=%1
if „.“=="%xx:~0,1%" ( copy %srcp%*%xx% %dest%%sub% ) else ( copy %srcp%%xx% %dest%%sub% )
exit /b 0
------ SCHNAPP: mycopy.bat ------Einfach die 3 Variablen dest, srcp und sdta korrekt belegen und ausprobieren.

Gruß
Volkmar

Hallo Volkmar,

supernett, dass du dir die Mühe gemacht hast so schnell zu antworten.
Ich habe ja immer wieder Respekt vor solchen (in meinen Augen) komplexen Strukturen.
Bin selbst dabei das alles zu lernen, aber irgendwie komm ich nicht so recht voran.

Bisher habe ich es geschafgft, das Unterverzeichnis zu erstellen und die Dateien hineinzukopieren.

Für den aktuellen Monat habe ich den Ordernamen 082007 erhalten, möchte allerdings 072007.

Habe eben deinen Code ausprobiert. Er erstellt auch einen Unterordner im gewünschten Verzeichnis, allerdings in dem Format 08.2-09

Bisher habe ich mit dem folgenden Code gearbeitet:

**set ordnername=%date:~6,2%%date:~9,4%

mkdir „C:…%ordnername%“

xcopy „C:…*.xls“ „C:…%ordnername%“**

Hast du zufällig eine Idee, wie ich weiterhin vorgehen könnte.
Bis auf den um 1 reduzierten Monat funzt alles…

Viele Grüße
Pascal

Hallo,

wenn die Auswertung ohnehin per Excel-VBA passiert, dann würde ich das Verzeichnis auch gleich aus Excel heraus erstellen, z.B. so:

Sub Speichern()
 MkDir "C:\HierSollEsHin"
 MkDir "C:\HierSollEsHin\" & Date$
 ActiveWorkbook.SaveAs ("C:\HierSollEsHin\" & Date$ & "\Mappe1.xls")
End Sub

Gruß, Bernd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Bernd,

danke für den Tipp, ist vielleicht wirklich einfacher als die Batch Variante.
Aber wie kann ich im VBA den Ordner so anlegen lassen, dass bei Namen des Verzeichnisses vom aktuellen Datum immer einen Monat zurückgerechnet wird?

082007–>072007
012008–>122007

Das Format der Bezeichnung soll im übrigen, wie oben beschrieben „MMJJJJ“ sein.

Vielen Dank im Voraus
Gruß
Pascal

Hallo,

ersetze einfach

date$

durch

Right(„0“ & IIf(Month(Date$) = „1“, „12“, Month(Date$) - 1) & IIf(Month(Date$) = „1“, Year(Date$) - 1, Year(Date$)), 6)

Gruß, Bernd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Pascal,

bei Dir scheint das Format von %date% anders zu sein als bei mir, es sollte also reichen in meinem Code die entsprechenden Stellen, an denen ich %date% verwende, anzupassen. Das mit dem Monat runterrechnen macht mein Skript dann schon richtig.

Oder Du nimmst die die Passage für die Monatsberechnung aus meinem Skript in Deines auf (Zeilen 9 bis 15).

Bei mir hat %date% das Ausgabeformat „tt.mm.jjjj“ für heute also z.B. „10.08.2007“ und deswegen benutze ich " set mon=%date:~3,2%" (Zeile 11), wo Du " %date:~6,2%" benutzt (für das Jahr analog " %date:~6,4%" und " %date:~9,4%", Zeile 16).

Aus alter Gewohnheit heraus habe ich den Ordnernamen im Format " jjjj-mm" benannt. Auch diese Stelle im Skript (Zeile 16) kannst Du einfach an Deine Wünsche anpassen, allerdings möchte ich Dir erklären, warum ich mein Format bevorzuge(n würde):
Mit meinem Format kann man historisch einfacher sortieren, egal ob auf- oder absteigend. Beispiel: drei Ordner je einen für Okt. 2005, Okt. 2006 und Okt. 2007 und ein Ordner Feb. 2007.Dein Format „Mein“ Format
aufsteigend absteigend aufsteigend absteigend
022007 102007 2005-10 2007-10
102005 102006 2006-10 2007-02
102006 102005 2007-02 2006-10
102007 022007 2007-10 2005-10Außerdem finde ich, dass man durch den Bindestrich, den Monat schneller erfassen kann.

Viel Spaß beim lernen und vielleicht möchtest Du mit Unterstützung eines Buches Windows-Skripting lernen, dann kann ich „Windows 2003 Shell Scripting“ von Armin Hanisch aus dem Verlag Addison-Wesley empfehlen.

Gruß
Volkmar

Hallo Volkmar,

was soll ich dazu noch sagen…?
Ich bin begeistert!
Vielen Dank!!! Du hattest recht mit dem Datumsformat.

Habe das ganze bei einem Arbeitskollegen am Rechner getestet. Bei ihm lief es. er hat auch das Format „TT.MM.JJJJ“

Bei mir ist allerdings noch der Wochentag vorangestellt. Demnach sieht mein Datumsformat folgendermaßen aus:

Fr 10.08.2007

Da ich die Batch Dateien in Makros einbinden will, die von mehreren Rechnern über Netzwerk ausgeführt werden sollen, müsste ich allerdings das Format für einen reibungslosen Ablauf auf allen Rechnern gleichermaßen anpassen.

Weisst du zufällig wie das funktioniert?

Viele Grüße
Pascal

Hallo Pascal,

soweit ich weiss, ist das Format von der Einstellung des Datumkurzformats in der Systemsteuerung abhängig, da dürfte bei Dir „TTT TT.MM.JJJJ“ stehen anstelle von „TT.MM.JJJJ“ (Systemsteuerung -> Regions- & Sprachoptionen -> Regionale Einstellungen -> Anpassen -> Datum: „Kurzes Datumformat“.

Bei meinem Skript habe ich ganz übersehen, dass es auch einen Jahreswechsel geben kann und deswegen hier noch eine korrigierte Version:------ SCHNIPP: mycopy.bat ------
@echo off
setlocal
REM Hauptzielpfad setzen (inkl. abschliessendem )
set dest=c:…dest…\
REM Hauptquellfad setzen (inkl. abschliessendem )
set srcp=c:…source…\
REM Quelldateien (wenn Eintrag mit . beginnt, dann eigtl. *., ansonsten genau die angegebene Datei.)
set sdta=.xls .dat def.doc
REM Name des Unterverzeichnisses erstellen
REM Format von %date% ist „tt.mm.jjjj“
set mon=%date:~3,2%
set jhr=%date:~6,4%
if 0 EQU %mon:~0,1% set mon=%mon:~-1%
set /a mon=%mon%-1
if 0 EQU %mon% (
set mon=12
set /a jhr=%jhr%-1
)
if 10 GTR %mon% set mon=0%mon%
set sub=%jhr%-%mon%
REM Verzeichnis erstellen
mkdir %dest%%sub%
REM Daten kopieren
for %%d in ( %sdta% ) do call :docopy %%d
endlocal
exit /b 0:docopy
set xx=%1
if „.“=="%xx:~0,1%" ( copy %srcp%*%xx% %dest%%sub% ) else ( copy %srcp%%xx% %dest%%sub% )
exit /b 0
------ SCHNAPP: mycopy.bat ------Gruß
Volkmar

Hi,

das hätte ich eben nichtmal gemerkt, aber danke, dass du mich daran erinnerst.

Also laut Systemsteuerung sollte das kurze Datumsformat aktiviert sein. Ich habe sogar das lange Format auf TT.MM.JJJ angepasst.

Wenn ich allerdings über die Konsole das Datum abrufe, bekomme ich immer noch „Fr 10.08.2007“

-(

Gruß

Hast Du die Konsole neu gestartet, nach dem Du die Änderung gesichert hast??

Ja habe ich. Aber er nimmt das Format irgendwie nicht an.

Hallo Pascal,

dann besorgen wir und das formatierte Datum halt etwas anders :wink:

Hier das verbesserte Skript:---- SCHNIPP: mycopy.bat ------
@echo off
REM dbg kann (also set dbg=) sein oder echo (also „set dbg=echo“)
set dbg=
setlocal
REM Hauptzielpfad setzen (inkl. abschliessendem )
set dest=c:…dest…\
REM Hauptquellfad setzen (inkl. abschliessendem )
set srcp=c:…source…\
REM Quelldateien (wenn Eintrag mit . beginnt, dann eigtl. *., ansonsten genau die angegebene Datei.)
set sdta=.xls .dat def.doc
REM Name des Unterverzeichnisses erstellen
REM Format von %date% ist „tt.mm.jjjj“
call :holeDatum
set mon=%datum:~3,2%
set jhr=%datum:~6%
if 0 EQU %mon:~0,1% set mon=%mon:~-1%
set /a mon=%mon%-1
if 0 EQU %mon% (
set mon=12
set /a jhr=%jhr%-1
)
if 10 GTR %mon% set mon=0%mon%
set sub=%jhr%-%mon%
REM Verzeichnis erstellen
%dbg% mkdir %dest%%sub%
REM Daten kopieren
for %%d in ( %sdta% ) do call :docopy %%d
endlocal
exit /b 0:docopy
set xx=%1
if „.“=="%xx:~0,1%" ( %dbg% copy %srcp%*%xx% %dest%%sub% ) else ( %dbg% copy %srcp%%xx% %dest%%sub% )
exit /b 0:holeDatum
REM Hier alle möglichen Variablen fuer Tagesformate loeschen
REM Englisch „DD“ Day
set dd=
REM Deutsch „TT“ Tag
set tt=
REM ggf. weitere Sprachen einfuegen
for /f „tokens=1 delims=.:/-, " %%u in (“%date%") do set d1=%%u
set tok=1-3
if „%d1:~0,1%“ GTR „9“ set tok=2-4
for /f „tokens=%tok% delims=.:/-, " %%u in (“%date%") do (
for /f „skip=1 tokens=2-4 delims=/-,().“ %%x in (‚echo.^|date‘) do (
set %%x=%%u
set %%y=%%v
set %%z=%%w
set d1=
set tok=
)
)
if „%dd%“ NEQ „“ (set datum=%dd%.%mm%.%yy%) else (
if „%tt%“ NEQ „“ (set datum=%tt%.%mm%.%jj%) else (
set datum=%date%
echo „unbekannte Ländereinstellung“))
exit /b 0
---- SCHNAPP: mycopy.bat ------Gruß
Volkmar

Hallo Volkmar,
habe nun alle Möglichkeiten getestet.

Die erste, bei der der Jahreswechsel nicht berücksichtigt war hat funktioniert, nachdem ich die Positionen angepasst habe.

Bei der 2. wurde kein Ordner mehr erstellt und die 3. und letzte gepostete Variante, bei der das Datumsformat von woanders kommt, erstellt gleich 3 Verzeichnisse, allerdings nur in dem jeweiligen Verzeichnis in dem sich die Batch-Datei selbst bvefindet. Zudem werden die Excel Dateien seit der 2. Variante nicht mehr kopiert.

Leider übersteigen die Programmschritte momentan meinen Horizont :frowning:

Hast du vielleicht noch eine Idee?
oder wäre es eventuell sinvoll, bei der Erstellung der ExcelAuswertungen direkt aus VBA ein Verzeichnis erstellen zu lassen und diese direkt dort ausgeben zu lassen?

Viele Grüße
Pascal

Hallo Pascal,

Die erste, bei der der Jahreswechsel nicht berücksichtigt war
hat funktioniert, nachdem ich die Positionen angepasst habe.

Die Position war auch in der zweiten Variante, so wie ich es für mein Format benötigte => Du musst anpassen

Bei der 2. wurde kein Ordner mehr erstellt und die 3. und
letzte gepostete Variante, bei der das Datumsformat von
woanders kommt, erstellt gleich 3 Verzeichnisse, allerdings
nur in dem jeweiligen Verzeichnis in dem sich die Batch-Datei
selbst bvefindet. Zudem werden die Excel Dateien seit der 2.
Variante nicht mehr kopiert.

Bei mir funktionieren beide Varianten

Leider übersteigen die Programmschritte momentan meinen
Horizont :frowning:

Ich muss gleich weg und kann mich erst morgen (oder ab Montag) wieder damit befassen. Ist das OK, dann helfe ich gerne weiter.

Hast du vielleicht noch eine Idee?
oder wäre es eventuell sinvoll, bei der Erstellung der
ExcelAuswertungen direkt aus VBA ein Verzeichnis erstellen zu
lassen und diese direkt dort ausgeben zu lassen?

Auch das ist eine Variante. Aber das solltest Du selbst entscheiden.

Gruß
Volkmar

Hallo Volkmar,

das eilt nicht. Wenn Du am Montag ein paar Minütchen Zeit hättest würde das voll und ganz reichen.

Ich probiere noch mal ein bisschen, vielleicht bekomme ich es ja noch zum laufen. Ansonsten mach ich auch Feierabend…

Wünsche Dir ein schöne Wochenende.

Viele Grüße
Pascal

Hallo Bernd,

vielen Dank für die Hilfe. Ich denke die VBA Variente ist um ein Vieles einfacher.

Viele Grüße
Pascal

Hallo Pascal,

bei mir funktionieren die Skripte, allerdings kann es sein, dass Du Probleme bekommst, wenn Leerzeichen (oder andere Sonderzeichen) im Pfad oder denDateinamen befinden. Von daher könnte es hilfreich sein die Variablen nach den copy-Befehlen in Anführungszeichen zu setzen, also:if „.“=="%xx:~0,1%" ( %dbg% copy „%srcp%*%xx%“ „%dest%%sub%“ ) else ( %dbg% copy „%srcp%%xx%“ „%dest%%sub%“ )anstattif „.“=="%xx:~0,1%" ( %dbg% copy %srcp%*%xx% %dest%%sub% ) else ( %dbg% copy %srcp%%xx% %dest%%sub% )(Etwa Zeile 33). Falls das auch nicht helfen sollte, setze doch mal die Variable „dbg“ in Zeile 3 auf den Wert „echo“ und lass das Skript laufen, dann sollten die eigentlich ausgeführten Befehle „mkdir“ und „copy“ nur ausgegeben werden und werden nicht ausgeführt. Vielleicht sieht man ja da, was schief läuft.

Gruß
Volkmar

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]