DOS - Batch

Hallo,

ich habe ein kleines Problem mit der Datumsabfrage in einem Batchfile. Wie kann ich es anstellen, daß mir die Batch einen Ordner erstellt, der automatisch als Namen das aktuelle Datum in der Form JJJJMMDD bekommt?
Danke schon mal im Voraus!
Ottifant

Wie kann ich es anstellen, daß mir die Batch einen

Ordner erstellt, der automatisch als Namen das aktuelle Datum
in der Form JJJJMMDD bekommt?

Hallo,
die nachfolgende müßte das tun. Wenn dir als ordnername auch die form mm-tt-jjjj reichen würde, ginge es mit ganz wenigen zeilen zu lösen :smile:
Gruß
olala

@echo off
rem Programm erwartet das datumsformat beim date-befehl in der form wt, mm-tt-jjjj
rem und setzt daraufhin die umgebungsvariablen wt,tt,mm,jj
rem in diesem beispiel wird daraufhin ein verzeichnis mit dem namen jjjjmmtt erzeugt
if „%1“=="" goto datumeinlesen
if „%2“=="" goto wochentag
if „%3“=="" goto tag
if „%4“=="" goto monat
find „-%4“ datum.tmp > nul
if not errorlevel==1 if errorlevel==0 set jjjj=%4
goto ende

wochentag

find „%1,“ datum.tmp > nul
if not errorlevel==1 if errorlevel==0 set wt=%1
goto ende

tag

find „-%2-“ datum.tmp > nul
if not errorlevel==1 if errorlevel==0 set tt=%2
goto ende

monat

find „%3-“ datum.tmp > nul
if not errorlevel==1 if errorlevel==0 set mm=%3
goto ende

datumeinlesen

echo.|date > datum.tmp
for %%n in (So Mo Di Mi Do Fr Sa) do call %0 %%n
for %%n in (01 02 03 04 05 06 07 08 09 10) do call %0 nix %%n
for %%n in (11 12 13 14 15 16 17 18 19 20) do call %0 nix %%n
for %%n in (21 22 23 24 25 26 27 28 29 30 31) do call %0 nix %%n
for %%n in (01 02 03 04 05 06 07 08 09 10 11 12) do call %0 nix nix %%n
for %%n in (2001 2002 2003 2004 2005 *gg* ) do call %0 nix nix nix %%n
md %jjjj%%mm%%tt%
set wt=
set tt=
set mm=
set jjjj=
if exist datum.tmp del datum.tmp

ende

Danke für Dein schnelles Posting!
Aber die Batch funzt leider nicht. Unter Win95 kommt zum Schluß „erforderlicher Parameter fehlt“ und unter WinNT „Syntaxfehler“.

In der temporär angelegten Datum.TMP steht folgendes:
Aktuelles Datum: So, 28.01.2001
Neues Datum (TT.MM.JJ):

Kannst Du mir da weiterhelfen?

Und außerdem habe ich noch ein paar Syntax-Fragen:

find „-%4“ datum.tmp > nul

Was genau macht der FIND-Befehl und was bedeutet das Minus vor bzw. hinter der Umgebungsvariablen?

if not errorlevel==1 if errorlevel==0 set jjjj=%4

Warum fragst Du den Errorlevel nach ungleich 1 und gleich 0? Hätte nicht bloß der Nullvergleich das selbe Ergebnis?

echo.|date > datum.tmp

Was bedeutet das .| zwischen Echo und Date?

for %%n in (So Mo Di Mi Do Fr Sa) do call %0 %%n

Was macht CALL in diesem Fall? Ich benutze CALL bisher nur, um aus einer Batch eine zweite aufzurufen.

Bin mal auf Deine Antworten gespannt!

ciao
Ottifant

Hallo,
gut das du mir deine datum.tmp gezeigt hast, dadran lag’s, deshalb funktioniert es nicht. Aber ich habe es umgeschrieben und sende es hier als Antwort zu diesem posting.
Ich habe win98, dort lief es perfekt, also müßte es nach der änderung auch auf win95 laufen. Win nT habe ich keines.

Gruß
olala

Aber die Batch funzt leider nicht. Unter Win95 kommt zum
Schluß „erforderlicher Parameter fehlt“ und unter WinNT
„Syntaxfehler“.
In der temporär angelegten Datum.TMP steht folgendes:
Aktuelles Datum: So, 28.01.2001
Neues Datum (TT.MM.JJ):

Deshalb ging es nicht. Es suchte in der datum.tmp mit find nach 01- und -28- aber dort steht ja bei dir 28. und .01.

Und außerdem habe ich noch ein paar Syntax-Fragen:

find „-%4“ datum.tmp > nul

Was genau macht der FIND-Befehl und was bedeutet das Minus vor
bzw. hinter der Umgebungsvariablen?

Wie oben schon gesagt, das programm sucht in der Datei datum.tmp nach dem String -%4, also in diesem Fall durch die for Schleife nacheinander nach -2000 -2001 -2002 usw.

if not errorlevel==1 if errorlevel==0 set jjjj=%4

Warum fragst Du den Errorlevel nach ungleich 1 und gleich 0?
Hätte nicht bloß der Nullvergleich das selbe Ergebnis?

Nein. Nur nach 0 geht nicht, weil es immer x oder größer bedeutet bei errorlevelabfragen.
if errorlevel==0 bedeutet im Klartext: Ist die Fehlernummer null oder größer, d.h. auch bei error 35 wäre der Vergleich positiv.

echo.|date > datum.tmp

Was bedeutet das .| zwischen Echo und Date?

Mit echo. übergebe ich einen Zeilenvorschub an date.
Hätte ich nur date > datum.tmp würde das Programm an der Stelle auf eine Eingabe warten.

for %%n in (So Mo Di Mi Do Fr Sa) do call %0 %%n

Was macht CALL in diesem Fall? Ich benutze CALL bisher nur, um
aus einer Batch eine zweite aufzurufen.

So ist es auch hier, nur die zweite batch gibt es nicht, das Programm ruft sich rekursiv selbst auf, %0 ist immer der eigene Name eines batch-Programms. In dem fall heißt das, das programm, ich nenne es mal prob.bat wird einfach mit dem aufruf von prog.bat gestartet.
Danach ruft es sich durch die for-schleife selbst nacheineder mit
call prog.bat So
call prog.bat Mo
call prog.bat Di

auf. Desgleichen für die andern for-schleifen.

batch für tt.mm.jjjj
rem Programm erwartet das datumsformat beim date-befehl in der form wt, tt.mm.jjjj
rem und setzt daraufhin die umgebungsvariablen wt,tt,mm,jj
rem in diesem beispiel wird daraufhin ein verzeichnis mit dem namen jjjjmmtt erzeugt
if „%1“=="" goto datumeinlesen
if „%2“=="" goto wochentag
if „%3“=="" goto tag
if „%4“=="" goto monat
find „.%4“ datum.tmp > nul
if not errorlevel==1 if errorlevel==0 set jjjj=%4
goto ende

wochentag

find „%1,“ datum.tmp > nul
if not errorlevel==1 if errorlevel==0 set wt=%1
goto ende

tag

find „%2.“ datum.tmp > nul
if not errorlevel==1 if errorlevel==0 set tt=%2
goto ende

monat

find „.%3.“ datum.tmp > nul
if not errorlevel==1 if errorlevel==0 set mm=%3
goto ende

datumeinlesen

echo.|date > datum.tmp
for %%n in (So Mo Di Mi Do Fr Sa) do call %0 %%n
for %%n in (01 02 03 04 05 06 07 08 09 10) do call %0 nix %%n
for %%n in (11 12 13 14 15 16 17 18 19 20) do call %0 nix %%n
for %%n in (21 22 23 24 25 26 27 28 29 30 31) do call %0 nix %%n
for %%n in (01 02 03 04 05 06 07 08 09 10 11 12) do call %0 nix nix %%n
for %%n in (2001 2002 2003 2004 2005 ) do call %0 nix nix nix %%n
md %jjjj%%mm%%tt%
echo %wt% %tt% %mm% %jjjj%
rem set wt=
rem set tt=
rem set mm=
rem set jjjj=
rem if exist datum.tmp del datum.tmp

ende

2 „Gefällt mir“

Klasse - das Batch läuft fehlerfrei!
Super - Du kannst Dir gar nicht vorstellen, wie sehr Du mir geholfen hast!

GROSSES LOB!!!

cu
Ottifant

Einfach klasse. Hilft mir auch sehr.
FYI: Es läuft auch problemlos unter NT.

Gruß

J.

kleine Einschränkung!
Hi,

heute habe ich Dein Batch noch mal unter NT WS4.0 SP5 gestartet und war ziemlich erstaunt, das er als Datum den 02.02.2001 ermittelt hat - wir haben doch erst den 1. Feb., oder?
Vielleicht finde ich ja den Fehler selbst.
(kann heute aber leider kein Vergleich mit Win95 machen - habe keinen entsprechenden Rechner hier auf Arbeit)

cu
Ottifant

Hallo,
bei win98 läuft es korrekt, auch heute am 01.02…
Denke mir, wenn ein Fehler, liegt es bei date in datei.
Entweder stimmt das systendatum nicht oder die syntax der eintragung in die datei ist nicht wie erwartet.
Wie gesagt, habe kein win nt.
Gruß
olala

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

Keine Sorge - ich habe den Fehler selbst relativ schnell gefunden. Die Date-Ausgabe in die Datei ist bei NT in der Tat etwas anders. Und Deine Batch habe ich jetzt so verändert, daß sie den Tag mit " %n" sucht (also mit einem führenden Leerzeichen). Und schon läuft alles wie geschmiert.

Nachher will ich nur noch mal testen, wie Dein Batch das ermittelte Datum an eine aufrufende Batch weitergibt - aber das soltle eigentlich kein Problem sein! *g*

cu
Ottifant