okidoki
Goto Top

Timestamps in Variablen erzeugen (auf Halde)

Hallo zusammen,

dieser Beitrag bezieht auf den Thread Mehrfach-timestamps erzeugen

Mit der Batch ist es möglich, mehrere timestamps zu erzeugen, nämlich genau in der Anzahl der aufgerufenen call-Anweisungen.

Klasse wäre es nun, eine definierte Anzahl an timestamps (quasi auf Halde) zu erzeugen, beispielsweise 99. Das würde allerdings den Rahmen der call-Anweisungen sprengen.
Wie lässt sich eine einstellbare (N=) Variablen-Erzeugung umsetzen?

@echo off & setlocal ENABLEDELAYEDEXPANSION

call :mktime ts1
timeout /t 1 >nul
call :mktime ts2
timeout /t 1 >nul
call :mktime ts3

goto :print

REM Makro
:mktime
for /f %%a in ('wmic path win32_Localtime get Year^,Month^,Day^,Hour^,Minute^,Second /value ^| findstr .') do set /a %%a  
for %%a in (month day hour minute second) do set "tmp=0!%%a!" &set "%%a=!tmp:~-2!"  
set "timestamp=%Year%-%Month%-%day%_%Hour%-%Minute%-%Second%"  
set "%~1=%timestamp%"  
exit /b

:print
echo %ts1%
echo %ts2%
echo %ts3%

Content-ID: 634846

Url: https://administrator.de/forum/timestamps-in-variablen-erzeugen-auf-halde-634846.html

Ausgedruckt am: 22.12.2024 um 18:12 Uhr

SlainteMhath
SlainteMhath 23.12.2020 um 10:00:21 Uhr
Goto Top
Moin,

dumme Frage: was für einen Sinn macht es denn, Timestamps "auf Halde" zu erzeugen? der TS soll doch immer das "jetzt" enthalten, oder nicht?

lg,
Slainte
StefanKittel
StefanKittel 23.12.2020 um 10:14:20 Uhr
Goto Top
Moin,

ich habe mir eben den Thread davor einmal angeschaut, verstehe aber Dein Problem nicht.

Entweder
A) Man verwendet für jeden Datensazu das "Jetzt" in Form eines "now"
oder
B) Man kopiert das "Jetzt" beim Start in eine Variable und verwendet diese immer wieder

Zusatz zu B
Wenn man dadurch doppelte EInträge erhält, fügt man noch einen Zähler hinzu.
Ich habe das z.B. bei einem Makro was aus Rechnungs-Emails die Anhänge zieht und speichert.
20201223_101325_4_Rechnung XYZ von ABC.pdf
20201223_101325_5_Rechnung XYZ von ABC.pdf

Stefan
OKIDOKI
OKIDOKI 23.12.2020 um 10:29:23 Uhr
Goto Top
Moin,

Slainte: Ich verstehe, dass andere manchmal die eigenen Probleme nicht nachvollziehen können ... das tut mir leid, vielleicht liegt es auch an der Art der Fragestellung ...

ok, ich versuche einen neuen Aufschlag:

Genau wie von Stefan vorgeschlagen kann man natürlich den Dateinamen aus mehreren Variablen zusammensetzen.
Nur, wenn der timestamp quasi der Dateiname ist und in der laufenden Batch mehrere Dateien angelegt werden, müssen die Dateinamen unterschiedlich sein (eben durch den unterschiedlichen timestamp). Ansonsten würde die erste Datei durch alle weiteren überschrieben!
Das ist deswegen ein Problem, da ansonsten an anderen Stellen immer wieder ein neuer timestamp erzeugt werden müsste (was natürlich kein Problem ist, den Code aber aufbläht).
So gesehen bedarf es eines Zähler bei der Erstellung der tsX. Nur wie?
StefanKittel
StefanKittel 23.12.2020 um 10:45:41 Uhr
Goto Top
Hallo,

kommt natürlich auf Dein System an.
Ich würde den "Master-Timestamp" + ein Trennzeichen (z.B. "-") + die Datensazt-ID (Autoincrement) verwenden.
Oder nur die ID.
OKIDOKI
OKIDOKI 23.12.2020 um 11:51:33 Uhr
Goto Top
"Oder nur die ID" ist ja gerade das Problem, dass ich im weiteren Verlauf mehrere benötige ...

Irgendwie müsste doch ein Zähler in den Call-Bereich einzubauen sein (mit einer zu definierenden Anzahl an Wiederholungen).
OKIDOKI
OKIDOKI 23.12.2020 aktualisiert um 12:25:49 Uhr
Goto Top
Habe hier mal einen Vorschlag:

@echo off & setlocal ENABLEDELAYEDEXPANSION

FOR /L %%A IN (Start,1,Ende) do goto :laufen

:laufen
FOR /L %%A IN (1,1,100) do call :mktime ts%%A

goto :print

:: Makro
:mktime
for /f %%a in ('wmic path win32_Localtime get Year^,Month^,Day^,Hour^,Minute^,Second /value ^| findstr .') do set /a %%a  
for %%a in (month day hour minute second) do set "tmp=0!%%a!" &set "%%a=!tmp:~-2!"  
set "timestamp=%Year%-%Month%-%day%_%Hour%-%Minute%-%Second%"  
set "%~1=%timestamp%"  

exit /b

:print
echo %ts88%
echo %ts2%
echo %ts3%
echo %ts62%
pause

:weiter
:: ...
StefanKittel
StefanKittel 23.12.2020 um 12:59:08 Uhr
Goto Top
Zitat von @OKIDOKI:
"Oder nur die ID" ist ja gerade das Problem, dass ich im weiteren Verlauf mehrere benötige ...
Klingt nach einem Design-Fehler.
Jede Datei sollte auf einem Datensatz in der DB beruhen und damit die eindeutige ID des Datensatzes erhalten.
Wenn zu einem Datensatz mehrere Dateien gehören hilft nur ID + Zähler
Lochkartenstanzer
Lochkartenstanzer 23.12.2020 aktualisiert um 13:20:51 Uhr
Goto Top
Moin,

Warum machst Du nocht einfach einen timestamp am Anfang und sorgst anschließend durch ein fortlaufendes Addendum (z.B. _x001, x002, x003, etc) für eindeutige Namen? Dann weißt Du welche Dateien aus dem gleichen Bathclauf stammen (durch den Timestamp) und durch das Addendum weißt Du, welche der Dateien aus dem Skript erzeugt wurden.

Irgendwie denkst Du zu kompliziert.

lks

PS: hast Du eine feste Anzahl von Dateien die erzeugt werden oder wird die dynamisch bestimmt?
OKIDOKI
OKIDOKI 23.12.2020 um 14:02:14 Uhr
Goto Top
oh Leute face-smile das "kompliziert denken" ist ein großer Fehler von mir ...
Die Idee von Lochkartenstanzer finde ich nachverfolginteressant: Einfach einen timestamp nehmen und diesen vor jedem nächsten Gebrauch um 1 erhöhen!
Hört sich total praktikabel an. Jetzt nur noch die Frage wie ...
mayho33
Lösung mayho33 23.12.2020 um 14:07:35 Uhr
Goto Top
Ich bin in Batch komplett der Noob und würde deshalb gleich auf PS oder so umsteigen, aber die Geschmäcker und Anforderungen sind ja unterschiedlich.

Du willst zur Laufzeit für jede Datei einen Timestamp erzeugen. Richtig?

Na dann hilft dir eventuell das als kleiner Leitfaden. Da wird was ähnliches behandelt:

https://stackoverrun.com/de/q/2932129


Grüße!
Lochkartenstanzer
Lösung Lochkartenstanzer 23.12.2020 aktualisiert um 14:32:19 Uhr
Goto Top
Moin,

Nichts leichter als das:

<code type =plain>

REM Initialisiere Zähler
SET ZAEHLER=0


REM Erzeuge Dateinamen aus Timestmp und Zähler
SET DATEINAME=datei-%timestamp%-!ZAEHLER!.endung
REM Erhöhe Zähler nach Benutzung
SET /A ZAEHLER=ZAEHLER+1


Oder so ähnlich.

lks
OKIDOKI
OKIDOKI 23.12.2020 aktualisiert um 16:58:22 Uhr
Goto Top
Hallo zusammen,

danke euch schonmal für die klasse Unterstützung!
mayho33: Vielen Dank für den Link! Ich glaube aber:
1. Das Problem bleibt besteht
2. Es interessiert viele Leute face-smile

Mit dem Zähler (Lochkartenstanzer) habe ich mir ebenfalls angeschaut. Beim Herumprobieren bin ich auf einen klasse Thread gestoßen:
timestamp auslesen

und habe daraufhin meinen Code angepasst.
Im Ergebnis braucht man während der Batch nur folgenden Einzeiler aufzurufen (auch an jeder weiteren Stelle der Batch möglich):
for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a  
echo %datetime%

Mittels einfacher Umformung kann der timestamp auch angepasst werden.

Alles in allem, mit der Hilfe von euch allen, und als Demo hier der komplette Code:
echo off
for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a  
echo %datetime%
echo tue dies und das
timeout /t 1 >nul
for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a  
echo %datetime%
echo tue dies und das
timeout /t 1 >nul
for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a  
echo %datetime%
echo tue dies und das
timeout /t 1 >nul
for /f %%a in ('powershell -Command "Get-Date -format HH:mm:ss"') do set datetime=%%a  
echo %datetime%
echo tue dies und das
pause
exit

btw: 'timeout /t 1 >nul' kann natürlich entfernt werden, sobald weitere Abläufe die Zeit verzögern!

Vielleicht hilft er ebenfalls vielen anderen weiter! Vielleicht gibt es aber auch noch Ergänzungen.
Herzlichen Dank an alle!!!

okidoki