2016-06-10 6 views
0

Ich habe eine sehr einfache Batch-DateiZeitstempel fehlt, wenn Batch-Datei aus dem Windows lief Scheduler

@SET isodt=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME::=-% 
DatabaseCleansing.Process.exe > output\output_%isodt%.txt 

Beim manuellen lief es schafft Dateinamen wie so

output_2016-06-09_23-29- 47.44.txt

wenn jedoch lief automatisch vom Windows-Scheduler es einen Dateinamen wie folgt erstellt:

output_2016-06-10_

Der Inhalt der Datei ist in beiden Fällen korrekt. Irgendwelche Vermutungen, was ich falsch gemacht habe?

+1

Verwendung Anführungszeichen um die Ausgabedatei: '>" output \ output_% isodt% .txt "(siehe @ JosefZs Antwort zur Erklärung). Obwohl ich Josefs locale unabhängige Lösung bevorzugen würde. – Stephan

Antwort

1
@ECHO OFF 
SETLOCAL EnableExtensions 
rem get CIM_DATETIME 
for /f "tokens=2 delims==" %%G in (
    'wmic OS get localdatetime /value') do set "ldt=%%G" 

rem simplified format yyyymmddHHMMSS.mm e.g. 20160610160046.36 
set "isodt=%ldt:~0,17%" 
echo simplified format yyyymmddHHMMSS.mm %isodt% 

rem modified ISO format yyyy-mm-dd_HH-MM-SS.mm e.g. 2016-06-10_16-00-46.36 
set "isodt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2%_%ldt:~8,2%-%ldt:~10,2%-%ldt:~12,5%" 
echo modified ISO format yyyy-mm-dd_HH-MM-SS.mm %isodt% 

rem use quotes around the output file (thanks for the thought, Stephan) 
DatabaseCleansing.Process.exe > "output\output_%isodt%.txt" 

Erklärung: Ihr Skript würde funktionieren wie erwartet, wenn zwischen 10:00:00 und 23:59:59 laufen. Die %time% Variable enthält jedoch einen führenden Abstand zwischen 00:00:00 und 09:59:59.
Dieses Verhalten tritt trotz der nächsten Formateinstellungen

==> reg query "HKCU\Control Panel\International" | findstr /I "sTimeFormat sShortTime" 
    sTimeFormat REG_SZ HH:mm:ss 
    sShortTime  REG_SZ HH:mm 

obwohl HH sollte es mit einer der führenden Null die Stunde anzuzeigen; Vergleichen Sie, was der Change the display of dates, times, currency, and measurements Artikel sagt:

Wählen Sie die Datums- und Uhrzeitformate, die Sie verwenden möchten. Windows verwendet folgende Schreibweisen angeben wie Datum und Uhrzeit angezeigt werden:

Time notations Displays 
-------------- -------- 
h    Hour (hh displays the hour with a leading zero) 
m    Minute (mm displays the minute with a leading zero) 
s    Second (ss displays the second with a leading zero) 
h/H    12 or 24 hour time display 

Verwenden

@SET "isodt=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME::=-%" 
@SET "isodt=%isodt: =0%" 

oder besser erhalten %isodt% Variable aus locale unabhängigCIM_DATETIME yyyymmddHHMMSS.mmmmmmsUUU format. Zum Beispiel könnten Sie next code snippet ändern Bindestriche hinzuzufügen und unterstreicht:

rem obtain %datetime% variable in locale independent yyyymmddHHMMSS format 
for /f "tokens=2 delims==" %%G in (
    'wmic OS get localdatetime /value') do set "datetime=%%G" 
set "isodt=%datetime:~0,17%" 

, Darüber hinaus SET "isodt=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME::=-%" Befehl könnte scheitern auch . 20- 0-10_15-22-11,63 unter folgenden kurzen Datumsformat Einstellung zurückkehrt, die in unerwünschter Weise die standardmäßig für meine Windows-8.1 Originalsystem vorinstalliert wurde locale als Raum angeblich sollte nach jedem Stillstand folgen, indem sie falsch interpretiert Czech language grammar rules:

==> reg query "HKCU\Control Panel\International" /V sShortDate 

HKEY_CURRENT_USER\Control Panel\International 
    sShortDate REG_SZ dd. MM. yyyy 
+0

Danke - das macht Sinn Ich werde es versuchen –

Verwandte Themen