Ustawienia regionalne nieświadome% DATE% i% TIME% w plikach wsadowych?

16

%DATE%I %TIME%zmienne środowiskowe zapewniają bieżącą datę i czas na komputerach z systemem Windows w wierszu poleceń i wewnątrz pliku wsadowego.

Niestety, te wartości są zależne od ustawień regionalnych! Oznacza to, że powiedzmy na niemieckiej maszynie

26.1.2011

zamiast

2011-26-01

to psuje sortowanie, jeśli chcesz użyć tej zmiennej w nazwie pliku.

Czy jest jakiś prosty sposób na uzyskanie nieświadomego ustawienia narodowego YYYY-MM-DDciągu daty w pliku wsadowym Windows?

W tej chwili pracuję z tym dość niechlujnym obejściem:

for /f "tokens=1,2,3,4 delims=. " %%i in ('date /t') do set date=%%k-%%j-%%i
echo %date%

ale jest to teraz specyficzne dla niemieckiej lokalizacji - oczywiście całkowicie niezależne rozwiązanie byłoby znacznie ładniejsze.

System operacyjny, o którym mowa, to Server 2008. Wolałbym nie używać narzędzia innej firmy, jeśli to w ogóle możliwe.

Pekka
źródło

Odpowiedzi:

22

Było kilka prób ( Rob van der Woude miał coś), ale tak naprawdę nic nie działało we wszystkich lokalizacjach. Możesz jednak uzyskać bieżący czas w łatwym do przeanalizowania formacie za pośrednictwem

wmic os get LocalDateTime

Następujące działania zapewniają już przynajmniej UTC:

@echo off
rem Get the time from WMI - at least that's a format we can work with
set X=
for /f "skip=1 delims=" %%x in ('wmic os get localdatetime') do if not defined X set X=%%x
echo.%X%

rem dissect into parts
set DATE.YEAR=%X:~0,4%
set DATE.MONTH=%X:~4,2%
set DATE.DAY=%X:~6,2%
set DATE.HOUR=%X:~8,2%
set DATE.MINUTE=%X:~10,2%
set DATE.SECOND=%X:~12,2%
set DATE.FRACTIONS=%X:~15,6%
set DATE.OFFSET=%X:~21,4%

echo %DATE.YEAR%-%DATE.MONTH%-%DATE.DAY% %DATE.HOUR%:%DATE.MINUTE%:%DATE.SECOND%.%DATE.FRACTIONS%

Jednak prawdopodobnie musisz uwzględnić przesunięcie strefy czasowej (chyba że chodzi o plik dziennika, wtedy zawsze użyłbym UTC), ale to nic, czego nie da się trochę obliczyć :-)

Joey
źródło
1
Doskonale, wygląda dokładnie tak, jak potrzebuję! Dziękuję Ci.
Pekka
2
Dla przypomnienia: for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%xjest trochę milszy. Dostępna jest tutaj także bardziej kompaktowa wersja , a mianowicie w tym komentarzu .
Tomalak
Trochę trudno jest znaleźć i zaktualizować wszystkie stare instancje, w których coś napisałeś :). Prawdopodobnie użyłbym już teraz Win32_UTCTime i Win32_LocalTime.
Joey
naprawdę fantastyczne!
jeromerg
Jak mówi @Tomalak, findstrrozwiązanie jest znacznie lepsze, ponieważ w moim przypadku oryginalna for(bez skip) iteruje 3 razy. Raz dla słowa "LocalDateTime", drugi raz dla rzeczywistej daty i trzeci raz dla pustej wartości (może podział wiersza?).
cavpollo
9

Oto dwuliniowy, którego używam, który wydaje się działać bez względu na wersję systemu Windows lub ustawienia czasu lokalnego:

FOR /f %%a in ('WMIC OS GET LocalDateTime ^| find "."') DO set DTS=%%a
set CUR_DATE=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%

Spowoduje to ustawienie zmiennej o nazwie% CUR_DATE% w następującym standardowym formacie ISO:

yyyy-mm-dd

Próbowałem uczynić z niego jedno-liniową wersję z &&, ale wydawało się, że nie jest to konieczne, więc skorzystałem z wersji dwuliniowej. Mam nadzieję że to pomoże.

Vocatus Gate
źródło
0

Używam tej sztuczki, aby uzyskać UTC ..

for /f "tokens=*" %%i in ('tzutil /g') do set CTZ=%%i
tzutil /s UTC
set UTC=
for /f  "skip=1 delims=" %%i in ('WMIC OS GET LocalDateTime') do if not defined UTC set UTC=%%i
tzutil /s "%CTZ%"
set UTC=%UTC:~0,4%-%UTC:~4,2%-%UTC:~6,3%T%UTC:~8,13%
echo %UTC%

Ma jednak efekt uboczny polegający na krótkiej zmianie całego systemu na UTC. Prawdopodobnie jest to OK na osobistej stacji roboczej, ale nie jestem pewien, jaki wpływ miałby duży serwer produkcyjny, który i tak powinien być ustawiony na UTC.

mark d drake
źródło