klaus20
Goto Top

Datum vergleichen

Hallo Zusammen,
vielleicht kann mir jemand (wie schon öfters) mir bei einer Abfrage helfen.

Ich möchte gerne falls das Datum unter 10 ist fologende Abfrage Minus 1 machen.
z.B.: Aktuelles Datum: 03.08.2014 ergibt mit meiner momentaner Abfrage 0814 ich möchte aber Minus 1 d.h. 0714


if exist C:\Test\E_Mail\%date:~-7,2%%date:~-2%\ >>backup.txt echo C:\Test\E_Mail\%date:~-7,2%%date:~-2%\


Danke für eure Hilfe.

Mit freundlichen Grüßen

Klaus

Content-ID: 245453

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

Ausgedruckt am: 22.11.2024 um 18:11 Uhr

bastla
bastla 03.08.2014 aktualisiert um 20:42:29 Uhr
Goto Top
Hallo Klaus20!

Etwa so (ungetestet):
@echo off & setlocal
set /a Jahr=%date:~-2%
set /a Monat=1%date:~-7,2%-1
if %Monat%==100 set "Monat=112" & set /a Jahr-=1  
set "Vormonat=%Monat:~-2%%Jahr%"  
Grüße
bastla

[Edit] @ rubberman: Was nutzt die eine oder andere Länge Vorsprung, wenn Kleinigkeiten wie ~ in Zeile 2 (ist inzwischen korrigiert) auf der Strecke bleiben ... face-confused [/Edit]
rubberman
Lösung rubberman 03.08.2014 aktualisiert um 16:02:16 Uhr
Goto Top
Hallo Klaus,

Beispiele dafür gibt es hier zwar zuhauf, aber egal ...

Schwierigkeit hierbei:
- Zahlen mit vorangestellter 0 werden als oktale Zahlen interpretiert. 08 und 09 gibt es also nicht.
- Der Januar bildet einen Sonderfall.

set /a "m = 1%date:~-7,2% - 1, y = 1%date:~-2%"  
if %m%==100 set /a "m = 12, y -= 1"  
echo %m:~-2%%y:~-2%
Grüße
rubberman

EDIT: Hallo bastla, wie immer die Hasenlänge vorn face-wink
Klaus20
Klaus20 03.08.2014 um 16:23:50 Uhr
Goto Top
Hallo bastla,
erst mal vielen Dank für Deine Hilfe.
Habe versucht Deinen Vorschlag im CMD Fenster auszuprobieren
%date:-2%
...Syntax falsch
%date:~-7,2%-1
Der Befehl "08-1" ist entweder falsch oder konnte nicht gefunden werden

Wäre schön wenn Du mir noch etwas auf die Sprünge helfen könntest.

Hallo rubberman,
auch Dir vielen Dank für Deine Hilfe.
Habe auch diverse Beispiele gefunden nur leider für mich (ungeübten) ohne Ergebnis.
Brauche aber unbedingt die vorangestellte 0.

Folgende Befehle liefern mir zwar die richtigen Werte aber ich weiß nicht wie ich sie weiterverarbeiten kann.
%date:~-0,2%
"03"
%date:~-7,2%
"08"
%date:~-2%
"14"

Hätte mir folgendes vorgestellt weiß nur nicht wie es zu realisieren ist.
*
If %date:~-0,2% < 10
%date:~-7,2% -1
else
%date:~-7,2%
endif
*

Grüße

Klaus
rubberman
Lösung rubberman 03.08.2014 aktualisiert um 18:48:57 Uhr
Goto Top
Hallo Klaus,

bei bastla fehlt schlicht die Tilde in Zeile 2.
set /a Jahr=%date:~-2%

Hätte mir folgendes vorgestellt weiß nur nicht wie es zu realisieren ist. ...
@echo off & setlocal

setlocal EnableDelayedExpansion
if 1%date:~,2% lss 110 (
  set /a "m = 1%date:~-7,2% - 1, y = 1%date:~-2%"  
  if !m!==100 set /a "m = 12, y -= 1"  
  set "myDate=!m:~-2!!y:~-2!"  
) else set "myDate=%date:~-7,2%%date:~-2%"  
endlocal &set "myDate=%myDate%"  

echo %myDate%
pause
Grüße
rubberman
Klaus20
Klaus20 03.08.2014 um 18:58:19 Uhr
Goto Top
Hallo rubberman,
vielen Dank - klappt wunderbar.
Könntest Du mir was zum Aufbau sagen da es für mich alles Neuland ist ??
Falls das Datum über 09 ist nimmt das Programm den aktuellen Monat ??

So ist nun meine aktuelle Abfrage (Sorry ich weiß immer noch nicht wie man richtig formatiert):

if exist C:\Test\E_Mail\%myDate%\ >>backup.txt echo C:\Test\E_Mail\%myDate%\

Grüße

Klaus
rubberman
rubberman 03.08.2014 um 19:38:39 Uhr
Goto Top
Falls das Datum über 09 ist nimmt das Programm den aktuellen Monat ??
Richtig.

Könntest Du mir was zum Aufbau sagen da es für mich alles Neuland ist ??
Ich versuch's mal mit Kommentaren...
@echo off & setlocal

REM Innerhalb einer Kommandozeile oder eines (in Klammern eingefassten)
REM  Blocks von Kommandozeilen wird eine Variable nur einmal zum Wert
REM  expandiert und zwar noch bevor(!) die die Zeile ausgeführt wird.
REM  Um das zu verhindern bedient man sich der "verzögerten Variablen-  
REM  erweiterung" und ersetzt in den betreffenden Variablen die  
REM  Prozentzeichen durch Ausrufezeichen.
setlocal EnableDelayedExpansion

REM In %date:~,2% finden sich die ersten beiden Zeichen (Tag) des
REM  Datums. Die vorangestellte 1 forciert einen numerischen Vergleich
REM  auch bei 08 und 09, wobei die 1 beim 2. Vergleichsoperanden
REM  natürlich auch vorangestellt werden muss.
REM  Ist also die Bedingung erfüllt, entspricht das deiner Vorgabe
REM  dass der Tag kleiner als 10 ist.
if 1%date:~,2% lss 110 (

  REM Mittels SET /A ist es möglich Berechnungen von ganzzahligen
  REM  Werten auszuführen. Man kann mehrere Operationen gleichzeitig
  REM  ausführen, wobei diese durch ein Komma getrennt werden müssen.
  REM  Auch hier stelle ich wieder eine 1 voran, um die Interpretation
  REM  als oktale Zahl zu verhindern. So wird beispielsweise aus der
  REM  (nicht erlaubten oktalen) Zahl 08, die Dezimalzahl 108.
  set /a "m = 1%date:~-7,2% - 1, y = 1%date:~-2%"  

  REM Hier wird überprüft, ob es sich um den Januar handelt. Falls
  REM  ja, wurde oben aus 01 die 101 und durch die Subtraktion von 1
  REM  der Wert 100. In diesem Fall wird der Monat auf 12 gesetzt
  REM  und das Jahr um 1 vermindert.
  if !m!==100 set /a "m = 12, y -= 1"  

  REM Da du die Werte zweistellig benötigst, werden nur die letzten
  REM  beiden Ziffern weiterverarbeitet. Die vorangestellte 1 wird
  REM  also wieder abgeschnitten, wodurch man auch Werte mit
  REM  vorangestellter 0 erhält.
  set "myDate=!m:~-2!!y:~-2!"  

REM Der "else" Zweig wird abgearbeitet wenn der Tag nicht kleiner  
REM  als 10 ist. Den Rest kennst du ja bereits ...
) else set "myDate=%date:~-7,2%%date:~-2%"  

REM Diese Zeile ist ein Konstrukt, um die Variable myDate über
REM  die Grenze der Subumgebung mit der verzögerten Variablen-
REM  erweiterung zu retten.
endlocal &set "myDate=%myDate%"  

echo %myDate%
pause

(Sorry ich weiß immer noch nicht wie man richtig formatiert)
Ganz unten auf jeder Seite gibt's den Link zur . Dort ist auch alles über Formatierungen erklärt.

Grüße
rubberman
Klaus20
Klaus20 03.08.2014 um 20:12:25 Uhr
Goto Top
Hallo rubberman,

vielen Dank für die hervorragende Kommentierung.
Nun wird mir das ganze Konstrukt etwas klarer ohne es allerdings ganz zu verstehen.
Aber "learning by doing".

Nochmals Danke

Gruß Klaus
Klaus20
Klaus20 04.08.2014 um 07:56:07 Uhr
Goto Top
Hallo rubberman,
hast Du noch eine Idee wie ich es unter Windows XP zum laufen bekomme ??

Gruß

Klaus
rubberman
rubberman 04.08.2014 aktualisiert um 18:34:19 Uhr
Goto Top
Hallo Klaus.

Hmm, das Script selbst hat eigentlich nix mit XP oder nicht XP zu tun (zumal du auch nicht schreibst was nicht funktioniert). Kann höchstens mit dem eingestellten Datumsformat zu tun haben.

Du kannst ja mal schreiben, was ein
echo %date%
bei dir unter XP ausgibt.

Alternativ teste mal was passiert wenn du für das Feststellen des Tages wie folgt arbeitest:
if 1%date:~-10,2% lss 110 (
Grüße
rubberman
Klaus20
Klaus20 05.08.2014 um 07:06:26 Uhr
Goto Top
Hallo rubberman,
wider mal Danke für Deine Mühe.
Habe folgendes rausgefunden:
  1. echo %date%
ergibt Di 05.08.2014

mit "if 1%date:~,2% lss 110 ("
bekomme ich 0814

mit "if 1%date:~-10,2% lss 110 ("
bekomme ich 0714 damit wird unter XP auch alles richtig abgearbeitet.
Ich weiß nur noch nicht wie es unter Win 7 ist das kann ich erst heute Abend rausfinden.

Grüße
Klaus
rubberman
Lösung rubberman 05.08.2014, aktualisiert am 06.08.2014 um 08:11:47 Uhr
Goto Top
Hallo Klaus,

das Orakel von Delphi hat mir geflüstert, dass es auf Win7 auch funktionieren wird face-wink

Nochmal: Das ist keine Frage von XP oder Vista oder Win7 oder Win8.1 oder ...
Das Format des Datums ist in mehreren Registry-Einstellungen hinterlegt.
HKEY_CURRENT_USER\Control Panel\International
Sobald du versuchst mit dem Script auf einer amerikanischen Maschine zu arbeiten, ist schon wieder Ebbe weil schon allein die Reihenfolge eine andere sein wird. Es gibt verschiedene Möglichkeiten, mit bzw. unabhängig von solchen Einstellungen zu arbeiten.
  • Batch pur:
    • Registry-Werte auslesen und auf dieser Basis das Datum parsen.
    • WMIC (nicht auf allen XP Versionen dabei)
    • MAKECAB (nicht ohne temporäre Datei)
  • Einbeziehung anderer Sprachen (VBScript, JScript etc.)

Wenn es bei dir aber mit %date:~-10,2% funktionieren sollte, kannst du es auch dabei belassen ...

Grüße
rubberman