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-Key: 245453

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

Printed on: April 25, 2024 at 17:04 o'clock

Member: bastla
bastla Aug 03, 2014 updated at 18:42:29 (UTC)
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]
Member: rubberman
Solution rubberman Aug 03, 2014 updated at 14:02:16 (UTC)
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
Member: Klaus20
Klaus20 Aug 03, 2014 at 14:23:50 (UTC)
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
Member: rubberman
Solution rubberman Aug 03, 2014 updated at 16:48:57 (UTC)
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
Member: Klaus20
Klaus20 Aug 03, 2014 at 16:58:19 (UTC)
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
Member: rubberman
rubberman Aug 03, 2014 at 17:38:39 (UTC)
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
Member: Klaus20
Klaus20 Aug 03, 2014 at 18:12:25 (UTC)
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
Member: Klaus20
Klaus20 Aug 04, 2014 at 05:56:07 (UTC)
Goto Top
Hallo rubberman,
hast Du noch eine Idee wie ich es unter Windows XP zum laufen bekomme ??

Gruß

Klaus
Member: rubberman
rubberman Aug 04, 2014 updated at 16:34:19 (UTC)
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
Member: Klaus20
Klaus20 Aug 05, 2014 at 05:06:26 (UTC)
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
Member: rubberman
Solution rubberman Aug 05, 2014, updated at Aug 06, 2014 at 06:11:47 (UTC)
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