ไม่ทราบตำแหน่งที่ตั้ง% DATE% และ% TIME% ในไฟล์แบตช์


16

%DATE%และ%TIME%ตัวแปรสภาพแวดล้อมให้วันและเวลาปัจจุบันในเครื่อง Windows บนบรรทัดคำสั่งและภายในแฟ้มแบทช์

น่าเศร้าที่คุณค่าเหล่านั้นเป็นที่ตระหนักถึงสถานที่! หมายความว่าคุณจะได้รับในเครื่องเยอรมัน

26.1.2011

แทน

2011-26-01

สกรูนี้เรียงลำดับขึ้นหากคุณต้องการใช้ตัวแปรนี้ในชื่อไฟล์

มีวิธีง่ายๆในการรับYYYY-MM-DDสตริงวันที่ที่ไม่ทราบในภาษาในไฟล์แบตช์ Windows หรือไม่

ในขณะนี้ฉันกำลังทำงานกับวิธีแก้ปัญหา kludgy นี้:

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

แต่ตอนนี้เฉพาะสถานเยอรมัน - เห็นได้ชัดว่าเป็นทางออกที่เป็นอิสระอย่างสมบูรณ์จะมีมากดีกว่า

ระบบปฏิบัติการที่เป็นปัญหาคือ Server 2008 ฉันไม่ต้องการใช้เครื่องมือของบุคคลที่สามหากเป็นไปได้

คำตอบ:


22

มีความพยายามอยู่สองสามครั้ง ( Rob van der Woudeมีบางอย่าง) แต่ไม่มีอะไรทำงานได้จริงในทุกพื้นที่ อย่างไรก็ตามคุณสามารถรับเวลาปัจจุบันในรูปแบบที่แยกได้ง่ายผ่าน

wmic os get LocalDateTime

ต่อไปนี้ทำให้คุณได้รับ 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%

อย่างไรก็ตามคุณอาจจำเป็นต้องบัญชีสำหรับการชดเชยโซนเวลา (เว้นแต่ว่าจะเป็นไฟล์บันทึกแล้วฉันจะใช้ UTC เสมอ) แต่นั่นไม่ใช่การคำนวณอะไรเลย :-)


1
ยอดเยี่ยมดูเหมือนว่าสิ่งที่ฉันต้องการ! ขอขอบคุณ.
Pekka

2
สำหรับบันทึก: for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%xมันเล็กกว่านิดหน่อย นอกจากนี้ยังมีรุ่นที่กะทัดรัดกว่าที่นี่ที่อยู่ในความคิดเห็นนั้น
Tomalak

เป็นการค้นหาและอัปเดตอินสแตนซ์เก่าทั้งหมดที่คุณเขียนอะไรบางอย่างยาก ๆ :) ฉันอาจใช้ Win32_UTCTime และ Win32_LocalTime ตอนนี้
Joey

น่าอัศจรรย์จริงๆ!
jeromerg

ตามที่ @Tomalak พูดว่าการfindstrแก้ปัญหานั้นดีกว่ามากสำหรับกรณีของฉันต้นฉบับfor(ไม่มีskip) จะทำซ้ำ 3 ครั้ง หนึ่งครั้งสำหรับคำ"LocalDateTime"นั้นเป็นครั้งที่สองสำหรับวันที่เกิดขึ้นจริงและเป็นครั้งที่สามสำหรับค่าที่ว่างเปล่า (อาจเป็นตัวแบ่งบรรทัด?)
cavpollo

9

นี่คือซับสองฉันใช้ซึ่งดูเหมือนว่าจะทำงานโดยไม่คำนึงถึงการตั้งค่า Windows รุ่นหรือเวลาท้องถิ่น:

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%

สิ่งนี้จะตั้งค่าตัวแปรที่เรียกว่า% CUR_DATE% ในรูปแบบมาตรฐาน ISO ต่อไปนี้:

yyyy-mm-dd

ฉันพยายามทำให้เป็นซับในด้วย && แต่ดูเหมือนจะไม่ใช้ดังนั้นฉันจึงหันไปใช้เวอร์ชันสองบรรทัด หวังว่านี่จะช่วยได้


0

ฉันใช้เคล็ดลับนี้เพื่อรับ 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%

อย่างไรก็ตามมันมีผลข้างเคียงของการเปลี่ยนระบบทั้งหมดเป็น UTC ชั่วคราว นี่อาจเป็น OK บนเวิร์กสเตชันส่วนบุคคล แต่ไม่แน่ใจว่าผลกระทบจะเป็นเซิร์ฟเวอร์การผลิตขนาดใหญ่ซึ่งควรตั้งค่าเป็น UTC อย่างไรก็ตาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.