จัดรูปแบบวันที่และเวลาในชุดสคริปต์ Windows


193

ในสคริปต์ชุดงาน Windows (Windows XP) ฉันต้องจัดรูปแบบวันที่และเวลาปัจจุบันเพื่อใช้ในภายหลังในชื่อไฟล์ ฯลฯ

มันคล้ายกับคำถาม Stack Overflow วิธีเพิ่มวันที่ในไฟล์แบตช์แต่ด้วยเวลาเช่นกัน

ฉันมีสิ่งนี้:

echo %DATE%
echo %TIME%
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %datetimef%

ซึ่งจะช่วยให้:

28/07/2009
 8:35:31.01
2009_07_28__ 8_36_01

มีวิธีที่ฉันสามารถอนุญาตให้ชั่วโมงหลักเดียวใน% TIME% ดังนั้นฉันจะได้รับต่อไปนี้หรือไม่

2009_07_28__08_36_01



คุณสามารถแทนที่ช่องว่างในdatetimefตัวแปรของคุณและใส่ 0 แทน ในตัวอย่างของคุณ:SET datetimef=%datetimef: =0%
SebaGra

คำตอบ:


148

ฉันลงเอยด้วยสคริปต์นี้:

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
echo secs=%secs%

set year=%date:~-4%
echo year=%year%

:: ใน WIN2008R2 เช่นฉันต้องการให้ 'set เดือน =% วันที่ของคุณ: ~ 3,2%' เช่นด้านล่าง :: มิฉะนั้น 00 จะปรากฏขึ้นสำหรับ MONTH

set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
echo month=%month%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
echo day=%day%

set datetimef=%year%%month%%day%_%hour%%min%%secs%

echo datetimef=%datetimef%

11
FYI บน Windows Server 2003 และ Windows 7 สคริปต์นี้ให้ฉัน "201200Mo_085806" (ปีและเวลาที่ถูกต้อง)
sfuqua

50
ตามที่ทราบสำหรับคนที่จะมาที่นี่จาก Google (เช่นฉัน): นี่ขึ้นอยู่กับสถานที่ดังนั้นจึงอาจต้องใช้การปรับแต่งเพื่อทำงานบน Windows ที่ไม่ใช่ภาษาอังกฤษ!
PiotrK

ฉันทำอย่างนี้: เวลา / T> Time.dat set / P ftime = <Time.dat set fDate = วันที่%: ~ 6 %% วันที่: ~ 3,2 %% วันที่: ~ 0,2 %% ftime: ~ 0,2 %% ftime: ~ 3,2% echo% fDate% -> 201310170928
น้ำแข็ง

% เวลา: ~ 0,2% ทำอะไรอยู่ที่ไหนเอกสารบางอย่างในโครงสร้าง: ~,%?
user1605665

6
ทั้งหมดนี้สามารถทำได้เพียง 2 บรรทัดโดยใช้การแทนที่สตริงธรรมดา: stackoverflow.com/a/23558738/1879699
Andreas

71
@ECHO OFF
: Sets the proper date and time stamp with 24Hr Time for log file naming
: convention

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%

PAUSE

2
ใน Windows Server 2003 และ Windows 7 สิ่งนี้ทำให้ฉันสตริงที่ถูกต้อง สง่างามยิ่งกว่าสิ่งที่ฉันสร้างขึ้นในอดีตดังนั้นขอบคุณ!
sfuqua

3
นี่คือสิ่งที่ให้ฉันใน Windows 7 ด้วยภาษารัสเซีย เวลาปัจจุบันคือ 2013-05-03T02: 22: 51 แต่สคริปต์จะพิมพ์: "2013-5. -01_02_22_51"
nightcoder

7
% date% จะให้สตริงที่แตกต่างกับสถานที่ที่แตกต่างกัน
AechoLiu

2
ส่งคืน 20146.0._173502 ถึงฉัน (สถานที่เช็ก)
Muflix

2
win7 64bit ultimate, เวลาไม่ถูกต้อง: 20140.01_131612, ต้องเป็น (2014.10.26_131612)
waza123

66

นี่คือวิธีที่ฉันสร้างชื่อไฟล์บันทึก (ขึ้นอยู่กับhttp://ss64.com/nt/syntax-getdate.html ):

@ECHO OFF
:: Check WMIC is available
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error

:: Use WMIC to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
   IF "%%~L"=="" goto s_done
      Set _yyyy=%%L
      Set _mm=00%%J
      Set _dd=00%%G
      Set _hour=00%%H
      SET _minute=00%%I
      SET _second=00%%K
)
:s_done

:: Pad digits with leading zeros
      Set _mm=%_mm:~-2%
      Set _dd=%_dd:~-2%
      Set _hour=%_hour:~-2%
      Set _minute=%_minute:~-2%
      Set _second=%_second:~-2%

Set logtimestamp=%_yyyy%-%_mm%-%_dd%_%_hour%_%_minute%_%_second%
goto make_dump

:s_error
echo WMIC is not available, using default log filename
Set logtimestamp=_

:make_dump
set FILENAME=database_dump_%logtimestamp%.sql
...

5
คำตอบที่ดีที่สุดสำหรับ SO สำหรับคำถามเกี่ยวกับการสร้างการประทับเวลาที่ไม่ขึ้นกับตำแหน่งที่ตั้งในแบทช์
Mike Campbell

2
! น่ากลัว ควรมีวิธีที่จะระบุว่านี่เป็นวิธีแก้ปัญหา
Rado

49

ฉันมักจะทำแบบนี้ทุกครั้งที่ฉันต้องการสตริงวันที่ / เวลา:

set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
set dt=%dt: =0%

นี่เป็นรูปแบบวันที่ / เวลาเยอรมัน (dd.mm.yyyy hh: mm: ss) โดยทั่วไปฉันเชื่อมต่อซับสเตรตและสุดท้ายแทนที่ช่องว่างทั้งหมดด้วยศูนย์

คำอธิบายสั้น ๆ ว่าสารทำงานอย่างไร:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

ดังนั้นเพื่อให้ได้ปีจากวันที่เช่น "29.03.2018" ใช้:

%DATE:~6,4%
       ^-----skip 6 characters
         ^---keep 4 characters 

7
โดยวิธีการแก้ปัญหาที่หรูหราที่สุดเมื่อคุณต้องการเวลาที่สะอาด (ไม่มีที่ว่างหรือตัวอักษรอื่น ๆ )
jvdneste

1
ไม่สามารถเห็นด้วยเพิ่มเติมกับ @jvdneste ขอบคุณสำหรับการแบ่งปัน mrt
this.user3272243

1
ยอดเยี่ยมอย่างแน่นอน - และผลงาน [ไวยากรณ์ที่ต้องการนั้นสับสนมาก แต่นั่นไม่ค่อยเป็นปัญหาของโปสเตอร์]
JosephDoggie

38

หากมีการติดตั้ง PowerShell คุณสามารถรับวันที่ / เวลาในรูปแบบที่คุณต้องการได้อย่างง่ายดายและเชื่อถือได้เช่น:

for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a
move "%oldfile%" "backup-%datetime%"

แน่นอนว่าทุกวันนี้มีการติดตั้ง PowerShell เสมอ แต่ใน Windows XP คุณอาจต้องการใช้เทคนิคนี้เฉพาะเมื่อสคริปต์ชุดงานของคุณถูกใช้ในสภาพแวดล้อมที่รู้จักซึ่งคุณรู้ว่ามี PS อยู่ (หรือตรวจสอบในชุดไฟล์ของคุณหาก PowerShell พร้อมใช้งาน ... )

คุณอาจถามอย่างมีเหตุผล: ทำไมใช้ไฟล์แบตช์เลยถ้าคุณสามารถใช้ PowerShell เพื่อรับวันที่ / เวลา แต่ฉันคิดว่าเหตุผลที่ชัดเจนคือ: (ก) คุณไม่คุ้นเคยกับ PowerShell ทั้งหมดและยังต้องการทำมากที่สุด เป็นวิธีที่ล้าสมัยด้วยไฟล์แบทช์หรือ (b) คุณกำลังอัปเดตสคริปต์เก่าและไม่ต้องการย้ายพอร์ตทั้งหมดไปยัง PS


(a) ในกรณีของฉันและมันใช้งานได้อย่างสมบูรณ์แบบ (แบ็ตสำหรับสภาพแวดล้อมของฉันเท่านั้น ขอบคุณ!
ccalboni

30

ฉันเจอปัญหานี้วันนี้และแก้ไขด้วย:

SET LOGTIME=%TIME: =0%

มันแทนที่ช่องว่างด้วย 0s และโดยทั่วไป zero-pads ชั่วโมง

หลังจากทำการค้นหาอย่างรวดเร็วฉันไม่พบว่ามันต้องการส่วนขยายคำสั่ง (ยังสามารถใช้งานได้กับ SETLOCAL DISABLEEXTENSIONS)


ตกลงการแทนที่ตัวแปร ตอนนี้ - วิธีการแทนที่โคลอน ( :) คืออะไร
Tomasz Gandor

@TomaszGandor มันใช้งานได้สำหรับฉัน: echo %TIME: =:%แต่ถ้ามันไม่ได้ลองหนีไป:กับคนที่^ชอบecho %TIME: =^:%(ซึ่งก็ใช้ได้กับฉันด้วย)
opello

1
+1 เพื่อความง่าย โคลอนไม่ถูกต้องในชื่อไฟล์ ตั้ง theTime =% Time :: =% จะลบมัน คุณสามารถแทนที่ช่องว่าง 0 ลบเครื่องหมายโคลอนและตัดให้เหลือ 6 ตัวอักษร (ซึ่งจะเป็นการลบส่วนทศนิยม) ในคำสั่งเดียว? ไม่ใช่เรื่องใหญ่หากใช้สองหรือสามบรรทัด ฉันแค่อยากรู้
riderBill

ไม่ใช่ว่าฉันรู้ โปรดติดตามหากคุณพบ!
opello

21

ตามที่ได้รับการบันทึกไว้การแยกวิเคราะห์วันที่และเวลาจะมีประโยชน์ก็ต่อเมื่อคุณรู้ว่ารูปแบบที่ใช้โดยผู้ใช้ปัจจุบัน (ตัวอย่างเช่น MM / dd / yy หรือ dd-MM-yyyy เพียงเพื่อตั้งชื่อสอง) สิ่งนี้สามารถตัดสินได้ แต่เมื่อถึงเวลาที่คุณทำความเครียดและการแจงทุกอย่างคุณจะยังคงจบลงด้วยสถานการณ์บางอย่างที่มีรูปแบบที่ไม่คาดคิดที่ใช้และจำเป็นต้องปรับแต่งเพิ่มเติม

นอกจากนี้คุณยังสามารถใช้โปรแกรมภายนอกบางตัวที่จะคืนค่าตัวบุ้งวันที่ในรูปแบบที่คุณต้องการ แต่มีข้อเสียของการต้องแจกจ่ายโปรแกรมอรรถประโยชน์ด้วยสคริปต์ / แบทช์ของคุณ

นอกจากนี้ยังมีเคล็ดลับแบบแบ็ตช์โดยใช้นาฬิกา CMOS ในลักษณะที่ค่อนข้างดิบ แต่นั่นก็ใกล้กับสายไฟเปลือยสำหรับคนส่วนใหญ่และยังไม่ได้เป็นสถานที่ที่ต้องการในการเรียกคืนวันที่ / เวลา

ด้านล่างเป็นวิธีการแก้ปัญหาที่หลีกเลี่ยงปัญหาข้างต้น ใช่มันแนะนำปัญหาอื่น ๆ แต่สำหรับจุดประสงค์ของฉันฉันพบว่านี่เป็นโซลูชันแบบพกพาที่ง่ายที่สุดชัดเจนและชัดเจนที่สุดสำหรับการสร้าง datestamp ในไฟล์. bat สำหรับระบบ Windows ที่ทันสมัย นี่เป็นเพียงตัวอย่าง แต่ฉันคิดว่าคุณจะเห็นวิธีการแก้ไขสำหรับรูปแบบวันที่และ / หรือเวลาอื่น ๆ

reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f
@REM reg query "HKCU\Control Panel\International" /v sShortDate
set LogDate=%date%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f

3
สิ่งที่ฉันกำลังมองหา บางสิ่งที่ใช้ได้กับการตั้งค่าภาษาทั้งหมด ขอบคุณ!
Lost_DM

+1 สำหรับ "ระบบ Windows ที่ทันสมัย" เราได้รับการจัดการ :) การล้อเล่นกันนี่เป็นสิ่งที่ฉลาดมากและอย่างที่คุณพูดแบบพกพาวิธีการจัดการกับปัญหา
Zach Young

9
นี่คือทางออกที่น่ากลัว หากล้มเหลวการตั้งค่าร่วมจะเปลี่ยนไปอย่างถาวร นอกจากนี้ยังแนะนำสภาพการแข่งขันพร้อมกับแอพพลิเคชั่นอื่น ๆ
MikeKulls

คุณสามารถใช้reg query "HKCU\Control Panel\International" /v sShortDateส่วนได้โดยไม่ต้องเปลี่ยนการตั้งค่ารีจิสทรี
tricasse

9

ต่อไปนี้อาจไม่ใช่คำตอบโดยตรง แต่เป็นคำตอบที่ใกล้ชิด?

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__0%time:~1,2%_%time:~3,2%_%time:~6,2%
else set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%

อย่างน้อยมันอาจเป็นแรงบันดาลใจ


9

หากคุณไม่ต้องการรูปแบบนี้:

2009_07_28__08_36_01

จากนั้นคุณสามารถใช้รหัส 3 บรรทัดต่อไปนี้ซึ่งใช้% date% และ% time%%:

set mydate=%date:/=%
set mytime=%time::=%
set mytimestamp=%mydate: =_%_%mytime:.=_%

หมายเหตุ: ตัวอักษร/และ:จะถูกลบออกและตัวละคร.และพื้นที่จะถูกแทนที่ด้วยขีดล่าง

ตัวอย่างผลลัพธ์ (ถ่ายเมื่อวันพุธ 8/5/15 เวลา 12:49 น. พร้อม 50 วินาทีและ 93 มิลลิวินาที):

echo %mytimestamp%
Wed_08052015_124950_93

เมื่อชั่วโมงน้อยกว่า 12 ตั้ง mydate = วันที่%: / =% กำหนด mytime =% เวลา :: =% กำหนด mytime =% mytime: = 0% ตั้ง mytimestamp =% mydate: = _% _% mytime:. = _ %
ragche

8
REM Assumes UK style date format for date environment variable (DD/MM/YYYY).
REM Assumes times before 10:00:00 (10am) displayed padded with a space instead of a zero.
REM If first character of time is a space (less than 1) then set DATETIME to:
REM YYYY-MM-DD-0h-mm-ss
REM Otherwise, set DATETIME to:
REM YYYY-MM-DD-HH-mm-ss
REM Year, month, day format provides better filename sorting (otherwise, days grouped
REM together when sorted alphabetically).

IF "%time:~0,1%" LSS "1" (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-0%time:~1,1%-%time:~3,2%-%time:~6,2%
) ELSE (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
)

ECHO %DATETIME%

6

การoffset:lengthจัดรูปแบบที่รองรับด้วยSETคำสั่งใน Windows จะไม่อนุญาตให้คุณใส่แผ่น0ตามที่คุณสนใจ

อย่างไรก็ตามคุณสามารถโค้ดสคริปต์ BATCH เพื่อตรวจสอบว่าชั่วโมงนั้นน้อยกว่า10และใช้
pad อื่นด้วยechoสตริงอื่นได้หรือไม่

คุณจะพบข้อมูลเกี่ยวกับSETคำสั่งในลิงค์นี้


คุณสามารถเปลี่ยนเป็นวิธีการเขียนโปรแกรมอื่นเพื่อมาที่นี่ได้

มันค่อนข้างง่ายใน unix bash (สามารถใช้ได้กับ Cygwin บน Windows) เพียงแค่พูดว่า

date +%Y_%m_%d__%H_%M_%S

และมันมักจะถูกต้องเสมอ


6

ฉันทำอย่างนี้:

REM Generate FileName from date and time in format YYYYMMTTHHMM

Time /T > Time.dat
set /P ftime= < Time.dat

set FileName=LogFile%date:~6%%date:~3,2%%date:~0,2%%ftime:~0,2%%ftime:~3,2%.log

echo %FileName%

LogFile201310170928.log


มันทำงานบนเซิร์ฟเวอร์ภาษาอังกฤษ (ชื่อ OS: Microsoft (R) Windows (R) Server 2003 Standard x64 Edition, เวอร์ชั่น OS: 5.2.3790 Service Pack 2 Build 3790)
Ice

1
และทดสอบบนเซิร์ฟเวอร์เยอรมัน (Betriebssystemname: Microsoft® Windows Server® 2008 Enterprise, Betriebssystemversion: 6.0.6002 Service Pack 2 Build 6002)
Ice

1
แม้แต่อันนี้ก็ไม่เป็นไร: (Betriebssystemname: Microsoft Windows Server 2012 Standard, Betriebssystemversion: 6.2.9200 Nicht zutreffend Build 9200)
Ice

4
::========================================================================  
::== CREATE UNIQUE DATETIME STRING IN FORMAT YYYYMMDD-HHMMSS   
::======= ================================================================  
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a  
SET DATETIME=%DTS:~0,8%-%DTS:~8,6%  

บรรทัดแรกจะแสดงผลในรูปแบบนี้เสมอโดยคำนึงถึงเขตเวลา:
20150515150941.077000 + 120
สิ่งนี้จะทำให้คุณมีเพียงการจัดรูปแบบผลลัพธ์ให้เหมาะกับความต้องการของคุณ


4

ไฟล์ bat นี้ (บันทึกเป็น datetimestr.bat) สร้างสตริงวันที่และเวลา 3 ครั้ง: (1) สตริงวันที่และเวลาที่ยาวซึ่งมีวันของสัปดาห์และวินาที, (2) สตริงวันที่และเวลาสั้น ๆ โดยไม่มีพวกเขาและ

@echo off
REM "%date: =0%" replaces spaces with zeros
set d=%date: =0%
REM "set yyyy=%d:~-4%" pulls the last 4 characters
set yyyy=%d:~-4%
set mm=%d:~4,2%
set dd=%d:~7,2%
set dow=%d:~0,3%
set d=%yyyy%-%mm%-%dd%_%dow%

set t=%TIME: =0%
REM "%t::=%" removes semi-colons
REM Instead of above, you could use "%t::=-%" to 
REM replace semi-colons with hyphens (or any 
REM non-special character)
set t=%t::=%
set t=%t:.=%

set datetimestr=%d%_%t%
@echo  Long date time str = %datetimestr%

set d=%d:~0,10%
set t=%t:~0,4%
set datetimestr=%d%_%t%
@echo Short date time str = %datetimestr%


@REM Short version of the code above
set d=%date: =0%
set t=%TIME: =0%
set datetimestr=%d:~-4%-%d:~4,2%-%d:~7,2%_%d:~0,3%_%t:~0,2%%t:~3,2%%t:~6,2%%t:~9,2%
@echo Datetimestr = %datetimestr%

pause

เพื่อให้ได้เครดิตที่เหมาะสมฉันได้รวมแนวคิดจาก Peter Mortensen (18 มิ.ย. 14, 21:02) และ opello (25 ส.ค. 54 เวลา 14:27)

คุณสามารถเขียนได้สั้นกว่านี้มาก แต่เวอร์ชั่นยาวนี้ทำให้การอ่านและทำความเข้าใจโค้ดง่ายขึ้น


4

ฉันยังใหม่กับไฟล์แบตช์และนี่คือรหัสของฉัน !! (ฉันไม่แน่ใจว่าทำไม แต่ฉันไม่สามารถรวมวันที่ / tและเวลา / tเข้าด้วยกันและฉันไม่สามารถใช้% date%และ% time%โดยตรงได้โดยไม่ต้องมีตัวแปร ... )

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
EXIT

มันถูกนำมาใช้ซ้ำจากคนอื่น ๆ (คำถามคือเพื่อให้ได้เวลาที่กำหนดในรูปแบบเพื่อใช้เป็นชื่อไฟล์)



3

หากต้องการสร้างการYYYY-MM-DD hh:mm:ssประทับเวลา (24 ชั่วโมง) ที่ฉันใช้:

SET CURRENTTIME=%TIME%
IF "%CURRENTTIME:~0,1%"==" " (SET CURRENTTIME=0%CURRENTTIME:~1%)
FOR /F "tokens=2-4 delims=/ " %%A IN ('DATE /T') DO (SET TIMESTAMP=%%C-%%A-%%B %CURRENTTIME%)

มันถือว่าการตั้งค่าภูมิภาคโดยเฉพาะอย่างยิ่ง?
Peter Mortensen

1
ตามss64.com/nt/syntax-variables.html%TIME%และ%DATE%ตัวแปรที่ใช้รูปแบบเดียวกับTIMEและDATEคำสั่งตามลำดับ ในระบบของฉันตัวแปรไม่ตรงกับการตั้งค่าภูมิภาคของฉัน
M. Dudley

3

สคริปต์ชุดนี้จะทำในสิ่งที่ OP ต้องการ (ทดสอบบน Windows XP SP3)

ฉันยังใช้เคล็ดลับรีจิสตรีที่ชาญฉลาดซึ่งอธิบายโดย "jph" ก่อนหน้านี้ซึ่ง IMHO เป็นวิธีที่ง่ายที่สุดในการจัดรูปแบบวันที่ที่สอดคล้องกัน 100% ให้"yyyy_MM_dd"กับระบบ Windows ใด ๆ ทั้งเก่าและใหม่ การเปลี่ยนแปลงค่ารีจิสทรีหนึ่งค่าสำหรับการทำเช่นนี้เป็นการชั่วคราวและไม่สำคัญทันที มันใช้เวลาเพียงไม่กี่มิลลิวินาทีก่อนที่มันจะถูกคืนกลับทันที

คลิกสองครั้งที่แบทช์ไฟล์นี้สำหรับการสาธิตทันทีหน้าต่างพร้อมรับคำสั่งจะปรากฏขึ้นและแสดงการประทับเวลาของคุณ . . . .

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: generates a custom formatted timestamp string using date and time.
:: run this batch file for an instant demo.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@ECHO OFF
SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A

:: --- CHANGE THE COMPUTER DATE FORMAT TEMPORARILY TO MY PREFERENCE "yyyy_MM_dd",
REG COPY "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f 2>nul >nul
REG ADD "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f 2>nul >nul

SET MYDATE=%date%

:: --- REVERT COMPUTER DATE BACK TO SYSTEM PREFERENCE
REG COPY "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f 2>nul >nul
REG DELETE "HKCU\Control Panel\International-Temp" /f 2>nul >nul

:: --- SPLIT THE TIME [HH:MM:SS.SS] TO THREE SEPARATE VARIABLES [HH] [MM] [SS.SS]
FOR /F "tokens=1-3 delims=:" %%A IN ('echo %time%') DO (
SET HOUR=%%A
SET MINUTES=%%B
SET SECONDS=%%C
)

:: --- CHOOSE ONE OF THESE TWO OPTIONS :
:: --- FOR 4 DIGIT SECONDS        //REMOVES THE DOT FROM THE SECONDS VARIABLE [SS.SS]
:: SET SECONDS=%SECONDS:.=%
:: --- FOR 2 DIGIT SECONDS        //GETS THE FIRST TWO DIGITS FROM THE SECONDS VARIABLE [SS.SS]
SET SECONDS=%SECONDS:~0,2% 

:: --- FROM 12 AM TO 9 AM, THE HOUR VARIABLE WE EXTRACTED FROM %TIME% RETURNS A SINGLE DIGIT, 
:: --- WE PREFIX A ZERO CHARACTER TO THOSE CASES, SO THAT OUR WANTED TIMESTAMP
:: --- ALWAYS GENERATES DOUBLE-DIGIT HOURS (24-HOUR CLOCK TIME SYSTEM).
IF %HOUR%==0 (SET HOUR=00)
IF %HOUR%==1 (SET HOUR=01)
IF %HOUR%==2 (SET HOUR=02)
IF %HOUR%==3 (SET HOUR=03)
IF %HOUR%==4 (SET HOUR=04)
IF %HOUR%==5 (SET HOUR=05)
IF %HOUR%==6 (SET HOUR=06)
IF %HOUR%==7 (SET HOUR=07)
IF %HOUR%==8 (SET HOUR=08)
IF %HOUR%==9 (SET HOUR=09)

:: --- GENERATE OUR WANTED TIMESTAMP
SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS%

:: --- VIEW THE RESULT IN THE CONSOLE SCREEN
ECHO.
ECHO    Generate a custom formatted timestamp string using date and time.
ECHO.
ECHO    Your timestamp is:    %TIMESTAMP%
ECHO.
ECHO.
ECHO    Job is done. Press any key to exit . . .
PAUSE > NUL

EXIT

ทำงานบน Windows 2019 ได้เช่นกัน ฉันจะแก้ปัญหาของคุณไปรอบ ๆ ฉันชอบมัน :)
user225479

คำถามฉันเพิ่งค้นพบว่าหลังเที่ยงคืนเครื่องหมาย "0" ต่อท้ายจะลดลงในเอาต์พุต ความคิดใดเป็นสาเหตุ? ผลลัพธ์ของฉันพร้อมกับสคริปต์ของคุณให้: เวลาของคุณคือ: 2019_09_16__0_58_07 แทน ..00_58_07 แต่หลังจาก 1 โมงมันทำงานได้ตามปกติ (และจะให้ผลลัพธ์: ..01_01_56)
user225479

ฉันเพิ่ม IF% HOUR% == 0 (SET HOUR = 00) ลงในคำสั่ง ELSE ที่ควรจะแก้ไขฉันหวังว่า :)
user225479

ขอบคุณสำหรับคำติชม @ user225479 ฉันแก้ไขรหัสแล้ว การเปลี่ยนรูปแบบที่เป็นไปได้ทั้งหมดของตัวแปร HOUR ที่แปลงเป็นรูปแบบ 24 ชั่วโมงจะทำงานได้อย่างถูกต้อง ฉันยังแก้ไขเลย์เอาต์เพื่อให้อ่านง่ายขึ้น
derty2


2

สร้างไฟล์ชื่อ "search_files.bat" และวางเนื้อหาด้านล่างลงในไฟล์ จากนั้นคลิกสองครั้ง ตัวแปร% THH% ชั่วคราวถูกนำมาใช้เพื่อจัดการกับ AM อย่างเหมาะสม หากมี 0 ใน 2 หลักแรกของเวลา Windows จะละเว้นชื่อไฟล์ส่วนที่เหลือของไฟล์ LOG

CD .
SET THH=%time:~0,2%
SET THH=%THH: =0%
dir /s /b *.* > %date:~10,4%-%date:~4,2%-%date:~7,2%@%THH%.%time:~3,2%.%time:~6,2%.LOG

2

ฉันชอบรุ่นสั้น ๆ ที่ด้านบนของ @The lorax แต่สำหรับการตั้งค่าภาษาอื่น ๆ มันอาจแตกต่างกันเล็กน้อย

ตัวอย่างเช่นในการตั้งค่าภาษาเยอรมัน (ที่มีรูปแบบวันที่ปกติ: dd.mm.yyyy) การสืบค้นรายเดือนจะต้องเปลี่ยนจาก 4,2 เป็น 3,2:

@ECHO OFF
: Sets the proper date and time stamp with 24h time for log file naming convention i.e.

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~3,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~3,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%
: Outputs= 20160727_081040
: (format: YYYYMMDD_HHmmss; e.g.: the date-output of this post timestamp)

PAUSE

1

นี่คือ 2 datetime stringเซ็นต์ของฉันสำหรับ ในMM DD YYYYระบบสลับรายการแรกและ%DATE:~รายการที่สอง

    REM ====================================================================================
    REM CREATE UNIQUE DATETIME STRING FOR ADDING TO FILENAME
    REM ====================================================================================
    REM Can handle dd DDxMMxYYYY and DDxMMxYYYY > CREATES YYYYMMDDHHMMSS (x= any character)
    REM ====================================================================================
    REM CHECK for SHORTDATE dd DDxMMxYYYY 
    IF "%DATE:~0,1%" GTR "3" (
        SET DATETIME=%DATE:~9,4%%DATE:~6,2%%DATE:~3,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
    ) ELSE (
    REM ASSUMES SHORTDATE DDxMMxYYYY
        SET DATETIME=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
        )
    REM CORRECT FOR HOURS BELOW 10
    IF %DATETIME:~8,2% LSS 10 SET DATETIME=%DATETIME:~0,8%0%DATETIME:~9,5%
    ECHO %DATETIME%

1

ฉันลองคำตอบที่ได้รับการยอมรับและใช้งานได้ดี โชคไม่ดีที่รูปแบบเวลาของสหรัฐอเมริกาดูเหมือนว่าจะเป็น H: MM: SS.CS และการหายไป 0 ที่ด้านหน้าทำให้เกิดปัญหาในการแยกวิเคราะห์ก่อน 10 โมงเช้า เพื่อให้ได้ผ่านอุปสรรค์นี้และยังอนุญาตให้มีการแยกรูปแบบเวลาส่วนใหญ่ของโลกฉันมากับกิจวัตรที่เรียบง่ายนี้ที่ดูเหมือนจะทำงานได้ค่อนข้างดี

:ParseTime
rem The format of %%TIME%% is H:MM:SS.CS or (HH:MM:SS,CS) for example 0:01:23.45 or 23:59:59,99
FOR /F "tokens=1,2,3,4 delims=:.," %%a IN ("%1") DO SET /A "%2=(%%a * 360000) + (%%b * 6000) + (%%c * 100) + %%d"
GOTO :EOF

สิ่งที่ดีกับรูทีนนี้คือคุณส่งผ่านสตริงเวลาเป็นพารามิเตอร์แรกและชื่อของตัวแปรสภาพแวดล้อมที่คุณต้องการให้มีเวลา (เป็นเซ็นต์วินาที) เป็นพารามิเตอร์ที่สอง ตัวอย่างเช่น:

CALL :ParseTime %START_TIME% START_CS
CALL :ParseTime %TIME% END_CS
SET /A DURATION=%END_CS% - %START_CS%

(* คริส *)


1

อาจจะเป็นสิ่งนี้:

@call:DateTime

@for %%? in (
    "Year   :Y"
    "Month  :M"
    "Day    :D"
    "Hour   :H"
    "Minutes:I"
    "Seconds:S"
) do @for /f "tokens=1-2 delims=:" %%# in (%%?) do @for /f "delims=" %%_ in ('echo %%_DT_%%$_%%') do @echo %%# : _DT_%%$_ : %%_

:: OUTPUT
:: Year    : _DT_Y_ : 2014
:: Month   : _DT_M_ : 12
:: Day     : _DT_D_ : 17
:: Hour    : _DT_H_ : 09
:: Minutes : _DT_I_ : 04
:: Seconds : _DT_S_ : 35

@pause>nul

@goto:eof

:DateTime
    @verify errorlevel 2>nul & @wmics Alias /? >nul 2>&1
    @if not errorlevel 1 (
        @for /f "skip=1 tokens=1-6" %%a in ('wmic path win32_localtime get day^,hour^,minute^,month^,second^,year /format:table') do @if not "%%f"=="" ( set "_DT_D_=%%a" & set "_DT_H_=%%b" & set "_DT_I_=%%c" & set "_DT_M_=%%d" & set "_DT_S_=%%e" & set "_DT_Y_=%%f" )
    ) else (
        @set "_DT_T_=1234567890 "
    )
    @if errorlevel 1 (
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "Y" "M" "D" "H" "I" "S") do @set "_DT_%%~?_=%%~?"
        @for %%? in ("Date" "Time") do @for /f "skip=2 tokens=1,3" %%a in ('reg query "HKCU\Control Panel\International" /v ?%%~? 2^>nul') do @for /f %%x in ('echo:%%_DT_%%a_%%') do @if "%%x"=="%%a" set "_DT_%%a_=%%b"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_T_=%%a%%b%%c"
    )
    @if errorlevel 1 (
        @if "%_DT_iDate_%"=="0" (set "_DT_F_=_DT_D_ _DT_Y_ _DT_M_") else if "%_DT_iDate_%"=="1" (set "_DT_F_=_DT_D_ _DT_M_ _DT_Y_") else if "%_DT_iDate_%"=="2" (set "_DT_F_=_DT_Y_ _DT_M_ _DT_D_")
        @for /f "tokens=1-4* delims=%_DT_sDate_%" %%a in ('date/t') do @for /f "tokens=1-3" %%x in ('echo:%%_DT_F_%%') do @set "%%x=%%a" & set "%%y=%%b" & set "%%z=%%c"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_H_=%%a" & set "_DT_I_=%%b" & set "_DT_S_=%%c"
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "T") do @set "_DT_%%~?_="
    )
    @for %%i in ("Y"                ) do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=  0 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-4%%"') do @set "_DT_%%~i_=%%~k"
    @for %%i in ("M" "D" "H" "I" "S") do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=100 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-2%%"') do @set "_DT_%%~i_=%%~k"
@exit/b

1

ในสถานการณ์เช่นนี้ใช้วิธีการเขียนโปรแกรมแบบมาตรฐานที่เรียบง่าย: แทนที่จะใช้ความพยายามอย่างมากในการแยกวิเคราะห์เอนทิตีที่ไม่รู้จักเพียงบันทึกการกำหนดค่าปัจจุบันรีเซ็ตเป็นสถานะที่ทราบแล้วแตกข้อมูลแล้วเรียกคืนสถานะดั้งเดิม ใช้ทรัพยากร Windows มาตรฐานเท่านั้น

รูปแบบวันที่และเวลาจะถูกเก็บไว้ภายใต้คีย์รีจิสทรี HKCU \ Control Panel \ International \ in [คำจำกัดความ MS] "ค่า": "sTimeFormat" และ "sShortDate" Reg เป็นตัวแก้ไขรีจิสทรีคอนโซลที่มาพร้อมกับ Windows ทุกรุ่น สิทธิ์ยกระดับไม่จำเป็นต้องมีการแก้ไขคีย์ HKCU

Prompt $N:$D $T$G

::Save current config to a temporary (unique name) subkey, Exit if copy fails
Set DateTime=
Set ran=%Random%
Reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp%ran%" /f
If ErrorLevel 1 GoTO :EOF

::Reset the date format to your desired output format (take effect immediately)
::Resetting the time format is useless as it only affect subsequent console windows
::Reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH_mm_ss"   /f
Reg add "HKCU\Control Panel\International" /v sShortDate  /d "yyyy_MM_dd" /f

::Concatenate the time and (reformatted) date strings, replace any embedded blanks with zeros
Set DateTime=%date%__%time:~0,2%_%time:~3,2%_%time:~6,2%
Set DateTime=%DateTime: =0%

::Restore the original config and delete the temp subkey, Exit if restore fails
Reg copy   "HKCU\Control Panel\International-Temp%ran%" "HKCU\Control Panel\International" /f
If ErrorLevel 1 GoTO :EOF
Reg delete "HKCU\Control Panel\International-Temp%ran%" /f

ง่ายตรงไปตรงมาและควรทำงานในทุกภูมิภาค

สำหรับเหตุผลที่ผมไม่เข้าใจการรีเซ็ต "sShortDate" ค่าจะมีผลทันทีในหน้าต่างคอนโซล แต่รีเซ็ตคล้ายกันมาก "sTimeFormat" ค่าไม่ไม่ได้มีผลบังคับใช้จนกว่าจะมีหน้าต่างคอนโซลใหม่จะถูกเปิด อย่างไรก็ตามสิ่งเดียวที่สามารถเปลี่ยนแปลงได้คือตัวคั่น - ตำแหน่งหลักได้รับการแก้ไขเช่นเดียวกับโทเค็นเวลา "HH" ควรจะเติมศูนย์นำหน้า แต่ไม่ โชคดีที่การแก้ปัญหาง่าย


-1 "แทนที่จะเพิ่มศูนย์นำหน้าทำไมคุณไม่รบกวนการกำหนดค่าของเครื่องเปลี่ยนความต้องการแบบสุ่มของคุณแล้วทำสิ่งที่คุณต้องการ?" วิธีการนี้ออกไปจากโลกนี้ต้องใช้ความพยายามอย่างมากและสามารถนำไปสู่จำนวนที่ไม่สิ้นสุดของผลที่ไม่พึงประสงค์ และฉันไม่ต้องการที่จะเริ่มต้นการอภิปรายเกี่ยวกับความสามารถในการอ่านและพฤติกรรมโค้ดที่คาดหวังแบบมาตรฐาน ความรุ่งโรจน์
vaitrafra

รีเซ็ตsTimeFormatรูปแบบเวลาจะไม่ได้ผล Nope เนื่องจากมีผลต่อพร้อมท์คอนโซลถัดไปให้ใช้โดยใช้for /f "delims=" %%G in ('cmd /C echo SET "DateTime=%%date%%__%%time%%"') do %%G
JosefZ

1

สคริปต์นี้ใช้อินเทอร์เฟซ WMI ที่เข้าถึงได้หลักผ่านเครื่องมือ WMIC ซึ่งเป็นส่วนหนึ่งของ Windows ตั้งแต่ Windows XP Professional (รุ่น Home รองรับเช่นกัน แต่เครื่องมือไม่ได้ติดตั้งตามค่าเริ่มต้น) สคริปต์ยังใช้วิธีแก้ปัญหาของเครื่องมือ WMIC ที่ขาดหายไปโดยการสร้างและเรียก WSH vbscript สำหรับการเข้าถึงอินเตอร์เฟส WMI และเขียนไปยังคอนโซลเอาต์พุตในรูปแบบเดียวกับที่เครื่องมือ WMIC จัดเตรียมไว้

@ECHO OFF
REM Returns: RETURN
REM Modify:  RETURN, StdOut
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond

CALL :getTime %*
ECHO %RETURN%
GOTO :EOF


REM SUBROUTINE
REM Returns: RETURN
REM Modify:  RETURN
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond
:getTime
  SETLOCAL EnableDelayedExpansion
    SET DELIM=-
    WHERE /Q wmic.exe
    IF NOT ERRORLEVEL 1 FOR /F "usebackq skip=1 tokens=*" %%x IN (`wmic.exe os get LocalDateTime`) DO (SET DT=%%x & GOTO getTime_Parse)
    SET _TMP=%TEMP:"=%
    ECHO Wscript.StdOut.WriteLine (GetObject("winmgmts:root\cimv2:Win32_OperatingSystem=@").LocalDateTime)>"%_TMP%\get_time_local-helper.vbs"
    FOR /F "usebackq tokens=*" %%x IN (`cscript //B //NoLogo "%_TMP%\get_time_local-helper.vbs"`) DO (SET DT=%%x & GOTO getTime_Parse)
    :getTime_Parse
      SET _RET=
      IF "%1" EQU "" (
        SET _RET=%DT:~0,4%%DELIM%%DT:~4,2%%DELIM%%DT:~6,2%%DELIM%%DT:~8,2%%DELIM%%DT:~10,2%%DELIM%%DT:~12,2%%DELIM%%DT:~15,3%
      ) ELSE (
        REM Not recognized format strings are ignored during parsing - no error is reported.
       :getTime_ParseLoop
         SET _VAL=
         IF "%1" EQU "YYYY" SET _VAL=%DT:~0,4%
         IF "%1" EQU "MM"   SET _VAL=%DT:~4,2%
         IF "%1" EQU "DD"   SET _VAL=%DT:~6,2%
         IF "%1" EQU "hh"   SET _VAL=%DT:~8,2%
         IF "%1" EQU "mm"   SET _VAL=%DT:~10,2%
         IF "%1" EQU "ss"   SET _VAL=%DT:~12,2%
         IF "%1" EQU "ms"   SET _VAL=%DT:~15,3%
         IF DEFINED _VAL (
           IF DEFINED _RET (
             SET _RET=!_RET!%DELIM%!_VAL!
           ) ELSE (
             SET _RET=!_VAL!
           )
         )
         SHIFT
         IF "%1" NEQ "" GOTO getTime_ParseLoop
      )
  ENDLOCAL & SET RETURN=%_RET%
GOTO :EOF

1

เคล็ดลับบรรทัดเดียวที่ดีที่จะหลีกเลี่ยงการขยายตัวแปรต้นคือการใช้ cmd /c echo ^%time^%

cmd /c echo ^%time^% & dir /s somelongcommand & cmd /c echo ^%time^%

0
:: =============================================================
:: Batch file to display Date and Time seprated by undescore.
:: =============================================================
:: Read the system date.
:: =============================================================
@SET MyDate=%DATE%
@SET MyDate=%MyDate:/=:%
@SET MyDate=%MyDate:-=:%
@SET MyDate=%MyDate: =:%
@SET MyDate=%MyDate:\=:%
@SET MyDate=%MyDate::=_%
:: =============================================================
:: Read the system time.
:: =============================================================
@SET MyTime=%TIME%
@SET MyTime=%MyTime: =0%
@SET MyTime=%MyTime:.=:%
@SET MyTime=%MyTime::=_%
:: =============================================================
:: Build the DateTime string.
:: =============================================================
@SET DateTime=%MyDate%_%MyTime%
:: =============================================================
:: Display the Date and Time as it is now.
:: =============================================================
@ECHO MyDate="%MyDate%" MyTime="%MyTime%" DateTime="%DateTime%"
:: =============================================================
:: Wait before close.
:: =============================================================
@PAUSE
:: =============================================================

0

สำหรับวิธีแก้ปัญหาที่ง่ายมากสำหรับวันที่เป็นตัวเลขเพื่อใช้ในชื่อไฟล์ให้ใช้รหัสต่อไปนี้:

set month=%date:~4,2%
set day=%date:~7,2%
set curTimestamp=%month%%day%%year%

rem then the you can add a prefix and a file extension easily like this
echo updates%curTimestamp%.txt

0

แยกผลลัพธ์ของคำสั่ง date โดยเครื่องหมายทับจากนั้นคุณสามารถย้ายแต่ละโทเค็นลงในตัวแปรที่เหมาะสม

FOR /F "tokens=1-3 delims=/" %%a IN ("%date:~4%") DO (
SET _Month=%%a
SET _Day=%%b
SET _Year=%%c
)
ECHO Month %_Month%
ECHO Day %_Day%
ECHO Year %_Year%
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.