okidoki
Goto Top

Timestamp mehrfach erzeugen bzw. Mehrfachvariablen

Hallo zusammen,

in einer Batch verarbeite ich mehrfach Dateien mit einem timestamp.
Dadurch, dass die Batch weiterläuft, benötige ich verschiedene timestamps - denn die werden später ja nicht akutalisiert.
Mein Vorgehen also bisher:
Ich erzeuge, quasi auf Vorrat, einige timestamps, die ich im weiteren Verlauf abrufe.
Ansonsten hätte ich das Problem, dass die verschiedenen Dateien mit einem und demselben timestamp versehen werden, bzw. immer überschrieben werden:

:: Datum un Uhrzeit
set YYYY=%date:~-4%
set YY=%date:~-2%
set MM=%date:~-7,2%
set DD=%date:~-10,2%
set hr=%time:~0,2%
if "%hr:~0,1%" == " " set hr=0%hr:~1,1%  
set min=%time:~3,2%
set sek=%time:~6,2%
set timestamp1=%YYYY%-%MM%-%DD%_%hr%-%min%-%sek%
set daystamp1=%YY%:%MM%:%DD%
:: 2. timestamp
set YYYY=%date:~-4%
set YY=%date:~-2%
set MM=%date:~-7,2%
set DD=%date:~-10,2%
set hr=%time:~0,2%
if "%hr:~0,1%" == " " set hr=0%hr:~1,1%  
set min=%time:~3,2%
set sek=%time:~6,2%
set timestamp2=%YYYY%-%MM%-%DD%_%hr%-%min%-%sek%
set daystamp2=%YY%:%MM%:%DD%
:: 3. timestamp ... usw.

Wie lässt sich das vereinfachen?

Gruß
okidoki

Content-ID: 634200

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

Ausgedruckt am: 19.11.2024 um 17:11 Uhr

146707
Lösung 146707 21.12.2020 aktualisiert um 21:22:11 Uhr
Goto Top
Mach dir n' Makro dafür das du überall einfach aufrufen kannst. (Hier verwende ich auch eine zuverlässigere Ermittlung des Timestamps der auch nicht Culture-Abhängig ist wie bei dir)
@echo off & setlocal ENABLEDELAYEDEXPANSION

:: timestamp1 
call :mktime ts1
echo %ts1%
timeout /t 1 >nul

:: timestamp 2
call :mktime ts2
echo %ts2%
timeout /t 1 >nul

:: timestamp 3
call :mktime ts3
echo %ts3%

:: at the end jump over makro
goto :eof

:: Timestamp 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
OKIDOKI
OKIDOKI 21.12.2020 aktualisiert um 20:07:04 Uhr
Goto Top
Hallo primal,

das ist ja eine 'prima' Lösung face-smile, vielen Dank!

PS: Klasse auch mit der zuverlässigen Ermittlungs-Variante - DANKE

Superklasse, werde ich weiter mit experimentieren (hilft hoffentlich auch anderen ...)

Danke primal!!!
OKIDOKI
OKIDOKI 21.12.2020 um 20:54:39 Uhr
Goto Top
Hallo primal,

jetzt muss ich doch noch einmal nachfragen:
Ich bekomme das Skript nicht zum Laufen in der Art, dass ich mit den Variablen weiterarbeiten kann.
Bedeutet, ich brauche keine anzeigen zwischendurch, sondern am Ende die gefüllten Variablen %ts1% etc. und dann die Möglichkeit, im Script weiterzuarbeiten.

Quasi nach diesem Schema:
@echo off & setlocal ENABLEDELAYEDEXPANSION

:: timestamp1 
call :mktime ts1
timeout /t 1 >nul

:: timestamp 2
call :mktime ts2
timeout /t 1 >nul

:: timestamp 3
call :mktime ts3

:: at the end jump over makro
goto :over

:: Timestamp 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%"  
goto :eof

:over
echo Weiterabeit ...
echo %ts3%
echo %ts3%
echo %ts3%
pause
exit
146707
146707 22.12.2020 aktualisiert um 11:17:34 Uhr
Goto Top
Das geht so auch out of the box. Du hast nur einen Tippfehler in deinen Variablen.
Nur zur Info, die timeout Befehle sind nur zur Demo da das die Zeiten sich zumindest unterscheiden, die kannst du im Normalfall natürlich weglassen.
@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%
OKIDOKI
OKIDOKI 22.12.2020 um 11:59:27 Uhr
Goto Top
DU bist der BESTE!
Dieses Forum war, ist und wird zukünftig das Beste bleiben, mit dem ich je so gute Erfahrungen gesammelt habe!

Eine kleine Anmerkung, die mir gestern schon aufgefallen war: Das Weglassen des timeout bewirkt aber weiterhin, dass die Variablen alle gleich sind. Von daher denke ich, dass der timeout doch notwendig ist!? Klar, weniger Code ist immer schöner face-smile

PS: Tifehplerp ... oh mann, danke face-smile face-smile face-smile
146707
146707 22.12.2020 aktualisiert um 12:05:45 Uhr
Goto Top
Zitat von @OKIDOKI:
Eine kleine Anmerkung, die mir gestern schon aufgefallen war: Das Weglassen des timeout bewirkt aber weiterhin, dass die Variablen alle gleich sind.
Was erwartest du denn anderes?? Ist doch normal wenn man einfach mal nachdenkt! Keine Pause dazwischen bewirkt das die Batch so schnell arbeitet das der Timestamp beim Zuweisen immer der gleiche ist, passiert in Millisekunden. Du schreibst aber nur Timestamps mit Sekundenauflösung. Ergo völlig normal.

Von daher denke ich, dass der timeout doch notwendig ist!?
Nö, ist nur damit die sich in der Demo hier zumindest unterscheiden! Das schreiben von unterschiedlichen Timestamps in ein und dem selben Skript bringt nur was wenn das Skript selbst länger oder im Loop läuft. Direkt hintereinander ohne Pause macht das eben nur keinen Sinn ...
OKIDOKI
OKIDOKI 22.12.2020 um 14:01:06 Uhr
Goto Top
Klar, klar face-smile, der Punkt ist halt nur, da ja letztlich die Millisekunden nicht angezeigt werden und in sofern die Variablen doch gleich sind, oder?

... ebenfalls klar, daher bin ich dir so dankbar, da ich am Scripanfang einige (verschiedene) Variablen "auf Halde" habe, um sie im weiteren Verlauf einsetzen zu können!

Einfach klasse!
146707
146707 22.12.2020 um 18:09:50 Uhr
Goto Top
Zitat von @OKIDOKI:

Klar, klar face-smile, der Punkt ist halt nur, da ja letztlich die Millisekunden nicht angezeigt werden und in sofern die Variablen doch gleich sind, oder?
Der Kandidat hat 100 Punkte.
Einfach klasse!
Na dann kannst du ja jetzt deinen Variablen auch einen Baum aufstellen face-wink
OKIDOKI
OKIDOKI 23.12.2020 um 08:18:14 Uhr
Goto Top
Jetzt habe ich doch noch eine Frage:
Wie würde ich denn vorgehen, wenn ich die "ts...." tatsächlich mehrfach erstellen würde, ohne einen fortlaufen Aufruf von "call :mktime ts1 bis tsx" ? (Mit Einstellmöglichkeit der Menge an Variablen)
Oder ist das ein neuer Thread?