Verständnisfrage Setlocal ENABLEDELAYEDEXPANSION und Zeit
Hallo an die Batchspezialisten unter Euch,
ich habe momentan ein Verständnisproblem mit Setlocal ENABLEDELAYEDEXPANSION und TIME.
Ich definiere ein Variable TIMESTAMP. Diese setzt das Format der Uhrzeit.
Soweit so gut.
Der Beginn und das Ende des Batchskriptes soll dokumentiert werden. Zwecks Test werden die Zeiten derzeit auf einem Testsystem auf STDOUT (Bildschirm) ausgegeben.
Deshalb die Codezeilen zum testen.
Später soll das in eine Logdatei geschrieben werden. Das ist nicht das Problem.
Eventuell habe ich einen Denk- / Logikfehlerfehler.
Frage: Wie kann man das Problem mit Startzeit / Endzeit besser lösen?
Das Logging in eine Datei ist nicht das Problem, sondern der TIMESTAMP.
Hintergrund: Es laufen verschiedene Scheduled Task, welche Batchdateien aufrufen.
Hier sollen nun die Start- / Endzeiten der Batches und innerhalb der Batches die Start-/Endezeiten und einzelne Schritten von aufgerufenen Programmen dokumentiert werden.
Variante 1 funktioniert nicht:
Variante 2 funktioniert:
Betriebssystems wo die Scheduled Tasks ausgeführt werden:
Windows Server 2008, 2008 R2, 2012, 2012 R2, 2012 und nachfolgende.
Ich kann mir denken bastla, Biber, colinardo und rubberman und andere Batchspezialisten haben bestimmt eine Lösung.
Zum Schluß: PowerShell ist nicht die Lösung, weil die Scheduled Tasks sind bereits als Batchdateien im Einsatz und sollen bleiben.
Da die Hersteller das sonst nicht unterstützen (supporten).
Vielen Dank für Eure Hilfe und Lösungsvorschäge.
Gruss Penny.
ich habe momentan ein Verständnisproblem mit Setlocal ENABLEDELAYEDEXPANSION und TIME.
Ich definiere ein Variable TIMESTAMP. Diese setzt das Format der Uhrzeit.
Set Timestamp=%TIME:~-11,2%.%TIME:~-8,2%.%TIME:~-5,2%,%TIME:~-0,2%
Der Beginn und das Ende des Batchskriptes soll dokumentiert werden. Zwecks Test werden die Zeiten derzeit auf einem Testsystem auf STDOUT (Bildschirm) ausgegeben.
Deshalb die Codezeilen zum testen.
Später soll das in eine Logdatei geschrieben werden. Das ist nicht das Problem.
Eventuell habe ich einen Denk- / Logikfehlerfehler.
Frage: Wie kann man das Problem mit Startzeit / Endzeit besser lösen?
Das Logging in eine Datei ist nicht das Problem, sondern der TIMESTAMP.
Hintergrund: Es laufen verschiedene Scheduled Task, welche Batchdateien aufrufen.
Hier sollen nun die Start- / Endzeiten der Batches und innerhalb der Batches die Start-/Endezeiten und einzelne Schritten von aufgerufenen Programmen dokumentiert werden.
Variante 1 funktioniert nicht:
@Echo OFF %debug%
Setlocal ENABLEDELAYEDEXPANSION
Set Timestamp=%TIME:~-11,2%.%TIME:~-8,2%.%TIME:~-5,2%,%TIME:~-0,2%
Set Timestamp=%Timestamp: =0%
echo Startzeit %Timestamp%
REM Kontollzeit via Aufruf Time
echo Startzeit %time%
REM Dient zum testen von Laufzeiten
>NUL DIR %windir% /-p
>NUL DIR %windir%\system /-p
>NUL DIR %windir%\system32 /-p
>NUL DIR %windir%\SoftwareDistribution /-p
>NUL DIR D:\Data\downloads /-p
echo.
echo Endzeit !Timestamp!
REM Kontollzeit via Aufruf Time
echo Endeeit %time%
exit /b 0
Variante 2 funktioniert:
@Echo OFF %debug%
Setlocal ENABLEDELAYEDEXPANSION
Set Timestamp=%TIME:~-11,2%.%TIME:~-8,2%.%TIME:~-5,2%,%TIME:~-0,2%
Set Timestamp=%Timestamp: =0%
echo Startzeit %Timestamp%
REM Kontollzeit via Aufruf Time
echo Startzeit %time%
REM Dient zum testen von Laufzeiten
>NUL DIR %windir% /-p
>NUL DIR %windir%\system /-p
>NUL DIR %windir%\system32 /-p
>NUL DIR %windir%\SoftwareDistribution /-p
>NUL DIR D:\Data\downloads /-p
echo.
Set Timestamp=%TIME:~-11,2%.%TIME:~-8,2%.%TIME:~-5,2%,%TIME:~-0,2%
Set Timestamp=%Timestamp: =0%
echo Endzeit %Timestamp%
REM Kontollzeit via Aufruf Time
echo Endeeit %time%
exit /b 0
Betriebssystems wo die Scheduled Tasks ausgeführt werden:
Windows Server 2008, 2008 R2, 2012, 2012 R2, 2012 und nachfolgende.
Ich kann mir denken bastla, Biber, colinardo und rubberman und andere Batchspezialisten haben bestimmt eine Lösung.
Zum Schluß: PowerShell ist nicht die Lösung, weil die Scheduled Tasks sind bereits als Batchdateien im Einsatz und sollen bleiben.
Da die Hersteller das sonst nicht unterstützen (supporten).
Vielen Dank für Eure Hilfe und Lösungsvorschäge.
Gruss Penny.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1451914725
Url: https://administrator.de/contentid/1451914725
Ausgedruckt am: 22.11.2024 um 09:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo,
Hättest du die Güte auch deine Fehlermeldung oder genau was nicht funktioniert uns mitzuteilen?
Gruß,
Peter
Hättest du die Güte auch deine Fehlermeldung oder genau was nicht funktioniert uns mitzuteilen?
Da die Hersteller das sonst nicht unterstützen (supporten).
Warum sollten sie? Ist doch deins...Gruß,
Peter
Hallo,
Deine Variabel Timestamp hat noch alte Werte. Aktualisieren oder getrennte für Start und Stop nutzen. In deiner Variante 2 machst du es richtig. Timestamp ist keine Uhr die weiterläuft, nur ein Platzhalter. Warum sollte eine Variabel mit Name Name und den Wert Ich plötzlich aus Ich Du machen?
Gruß,
Peter
Deine Variabel Timestamp hat noch alte Werte. Aktualisieren oder getrennte für Start und Stop nutzen. In deiner Variante 2 machst du es richtig. Timestamp ist keine Uhr die weiterläuft, nur ein Platzhalter. Warum sollte eine Variabel mit Name Name und den Wert Ich plötzlich aus Ich Du machen?
Gruß,
Peter
Hehe. Erst mal EnableDelayedExpansion hat nix mit dem Problem zu tun, bzw. löst es nicht.
%date% und %time% (und %errorlevel% und ein paar mehr) sind dynamische Variablen, keine Umgebungsvariablen. Siehe auch https://ss64.com/nt/syntax-variables.html
Auf deren Wert lässt sich aber auch mit den umschließenden Prozentzeichen zugreifen, so dass es den Anschein erweckt, es wären Umgebungsvariablen. Tatsächlich werden sie aber durch den cmd.exe Prozess aktualisiert. (Sie lassen sich durch Umgebungsvariablen gleichem Namens überschreiben, im Sinne vom englischen "override", woraufhin ihr Wert nicht mehr automatisch aktualisiert wird. Aber das nur nebenher.)
Solltest du nun eine Umgebungsvariable foo mit dem derzeitigen Wert von %time% definieren, dann wird dieser Wert natürlich nicht aktualisiert. Für den cmd.exe Prozess ist foo eine Umgebungsvariable wie jede andere. Also keine automatische Variable, die aktualisiert wird. Sie behält ihren Wert, es sei denn er wird irgendwann durch SET überschrieben.
Delayed Expansion, aka verzögerte Variablenerweiterung, hat einen ganz anderen Sinn. Die cmd.exe expandiert Variablen innerhalb einer Kommandozeile, oder innerhalb eines in Klammern gesetzten Blocks von Kommandozeilen, nur einmal zu ihrem Wert. Und zwar noch im Parse-Prozess, vor der Ausfürung der Zeile / des Blocks. Um diese frühzeitige Expansion zu vermeiden und auch in der Zeile / im Block upgedatete Werte abgreifbar zu machen, kann man mit verzögerter Variablenerweiterung arbeiten, verbunden mit der geänderten Syntax (Ausrufe- statt Prozentzeichen).
// EDIT Ach ja, die Lösung des Problemchens ist natürlich eine Subroutine die dir deine Timestamp Variable aktualisiert.
Nutzt WMIC weil es einen Wert liefert, dessen Format nicht von lokalen Settings abhängig ist.
Steffen
%date% und %time% (und %errorlevel% und ein paar mehr) sind dynamische Variablen, keine Umgebungsvariablen. Siehe auch https://ss64.com/nt/syntax-variables.html
Auf deren Wert lässt sich aber auch mit den umschließenden Prozentzeichen zugreifen, so dass es den Anschein erweckt, es wären Umgebungsvariablen. Tatsächlich werden sie aber durch den cmd.exe Prozess aktualisiert. (Sie lassen sich durch Umgebungsvariablen gleichem Namens überschreiben, im Sinne vom englischen "override", woraufhin ihr Wert nicht mehr automatisch aktualisiert wird. Aber das nur nebenher.)
Solltest du nun eine Umgebungsvariable foo mit dem derzeitigen Wert von %time% definieren, dann wird dieser Wert natürlich nicht aktualisiert. Für den cmd.exe Prozess ist foo eine Umgebungsvariable wie jede andere. Also keine automatische Variable, die aktualisiert wird. Sie behält ihren Wert, es sei denn er wird irgendwann durch SET überschrieben.
Delayed Expansion, aka verzögerte Variablenerweiterung, hat einen ganz anderen Sinn. Die cmd.exe expandiert Variablen innerhalb einer Kommandozeile, oder innerhalb eines in Klammern gesetzten Blocks von Kommandozeilen, nur einmal zu ihrem Wert. Und zwar noch im Parse-Prozess, vor der Ausfürung der Zeile / des Blocks. Um diese frühzeitige Expansion zu vermeiden und auch in der Zeile / im Block upgedatete Werte abgreifbar zu machen, kann man mit verzögerter Variablenerweiterung arbeiten, verbunden mit der geänderten Syntax (Ausrufe- statt Prozentzeichen).
// EDIT Ach ja, die Lösung des Problemchens ist natürlich eine Subroutine die dir deine Timestamp Variable aktualisiert.
@echo off &setlocal
call :updateTimestamp
echo %Timestamp%
timeout /t 3
call :updateTimestamp
echo %Timestamp%
pause
exit /b
:updateTimestamp
for /f %%i in ('WMIC OS Get LocalDateTime /value') do for /f %%j in ("%%i") do set "%%j"
set "Timestamp=%LocalDateTime:~8,2%.%LocalDateTime:~10,2%.%LocalDateTime:~12,2%,%LocalDateTime:~15,2%"
exit /b
Steffen