Toplu iş dosyalarında yerel ayardan habersiz% DATE% ve% TIME%?


16

%DATE%Ve %TIME%ortam değişkenleri komut satırında ve toplu dosya içindeki Windows makinelerde geçerli tarih ve saati sağlarlar.

Ne yazık ki, bu değerler yerel ayardır! Demek ki, bir Alman makinesinde,

26.1.2011

onun yerine

2011-26-01

bir dosya adında bu değişkeni kullanmak istiyorsanız bu, sıralamayı kapatır.

YYYY-MM-DDWindows toplu iş dosyasında yerel ayardan habersiz bir tarih dizesini tutmanın kolay bir yolu var mı ?

Şimdilik bu oldukça geçici çözümle çalışıyorum:

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

ancak bu Alman yerel ayarlarına özgüdür - açıkçası, tamamen bağımsız bir çözüm çok daha hoş olurdu .

Söz konusu işletim sistemi Server 2008'dir. Mümkünse üçüncü taraf bir araç kullanmamayı tercih ederim.

Yanıtlar:


22

Birkaç girişim vardı ( Rob van der Woude bir şey vardı), ama hiçbir şey gerçekten tüm yerel arasında çalıştı. Ancak, şu anki zamanı kolayca ayrıştırılabilir biçimde alabilirsiniz.

wmic os get LocalDateTime

Aşağıdakiler sizi en azından UTC'ye götürür:

@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%

Ancak, muhtemelen (bir günlük dosyası için olmadıkça, her zaman UTC kullanırdım) saat dilimi uzaklığını hesaba katmanız gerekir, ancak bu biraz hesaplama yapamaz :-)


1
Mükemmel, tam olarak ihtiyacım olan şeye benziyor! Teşekkür ederim.
Pekka

2
Kayıt için: for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%xbiraz daha güzel. Burada daha kompakt bir versiyon da var , yani bu yorumda .
Ocak'ta Tomalak

Bir şey yazdığınız tüm eski örnekleri bulmak ve güncellemek biraz zor :). Muhtemelen şimdiye kadar Win32_UTCTime ve Win32_LocalTime kullanacaktım.
Joey

gerçekten inanılmaz!
jeromerg

@Tomalak'ın dediği gibi, findstrçözüm çok daha iyidir, benim durumumda olduğu gibi, orijinal for(olmadan skip) 3 kez tekrarlar. Sözcük için "LocalDateTime"bir kez, gerçek tarih için ikinci kez ve boş bir değer için üçüncü kez (belki satır sonu?).
19:31

9

İşte, Windows sürümü veya yerel saat ayarlarından bağımsız olarak çalıştığı görünen iki astarlı:

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%

Bu, aşağıdaki ISO standart biçiminde% CUR_DATE% adlı bir değişken ayarlar:

yyyy-mm-dd

&& ile tek satırlık yapmayı denedim, ama almadım, bu yüzden iki satırlı sürüme başvurdum. Bu yardımcı olur umarım.


0

Bu hileyi UTC almak için kullanıyorum.

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%

Ancak, sistemin tamamını UTC'ye kısaca değiştirmenin yan etkisi vardır. Bu muhtemelen kişisel bir iş istasyonunda sorun değil, ancak yine de UTC'ye ayarlanması gereken etkinin büyük bir üretim sunucusu olacağından emin değilim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.