Windows batch: จัดรูปแบบวันที่เป็นตัวแปร


105

ฉันจะบันทึกวันที่ปัจจุบันในรูปแบบ YYYY-MM-DD ลงในตัวแปรบางตัวในไฟล์. bat ของ Windows ได้อย่างไร

อะนาล็อกเปลือก Unix:

today=`date +%F`
echo $today

1
เป็นไปได้ที่จะซ้ำกันของรูปแบบสคริปต์ Windows batch วันที่และเวลา
adarshr


1
adarshr คำตอบสำหรับคำถามนั้นใช้วิธีที่ค่อนข้างน่ากลัวและผิดพลาดในการจัดการกับมัน ฉันไม่แนะนำให้ใช้
Joey

ลิงก์นี้มีประโยชน์ในการทำความเข้าใจคำตอบด้านล่าง ss64.com/nt/for_f.html
smwikipedia

คำตอบ:


151

คุณสามารถรับวันที่ปัจจุบันด้วยวิธีที่ไม่เชื่อเรื่องพระเจ้าโดยใช้

for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x

จากนั้นคุณสามารถแยกแต่ละส่วนโดยใช้สตริงย่อย:

set today=%MyDate:~0,4%-%MyDate:~4,2%-%MyDate:~6,2%

อีกวิธีหนึ่งที่คุณได้รับตัวแปรที่มีแต่ละส่วนจะเป็น:

for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%

ดีกว่าการเล่นซอกับสตริงย่อยโดยเสียค่าใช้จ่ายในการทำให้เนมสเปซตัวแปรของคุณเป็นมลพิษ

หากคุณต้องการ UTC แทนเวลาท้องถิ่นคำสั่งจะเหมือนกันมากหรือน้อย:

for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%

1
@ user2023861 ดูเหมือนว่าแม้ว่าฉันจะเปิดพรอมต์คำสั่ง แต่ฉันก็มักจะได้วันที่ / เวลาที่ถูกต้องในขณะที่เรียกใช้คำสั่งไม่ใช่เมื่อฉันเปิดพรอมต์คำสั่ง
ADTC

5
โปรดทราบว่าหากคุณเรียกใช้บรรทัดด้านบนหลายครั้งคุณจะไม่ได้รับวันที่ใหม่สำหรับการเรียกแต่ละครั้งเนื่องจากจะตรวจสอบว่าตัวแปรนั้นไม่ได้กำหนดไว้ สิ่งนี้จำเป็นเนื่องจากfor /fส่งคืนสองบรรทัดโดยที่บรรทัดหลังเป็นบรรทัดว่าง คุณสามารถแก้ปัญหานั้นได้โดยใช้set MyDate=ระหว่าง ฉันเดาว่านั่นคือสิ่งที่ user2023861 สะดุด
Joey

1
@CharlesWood อย่างน้อยฉันก็พยายามอย่างมากเพื่อความทนทานในไฟล์แบตช์ของตัวเองแม้ว่าทุกวันนี้ฉันมักจะใช้ PowerShell แทน
Joey

1
ตัวแปรที่จะถูกตั้งค่า: Year, Month, Day, Hour, Minute, Second, Quarter, WeekInMonth,DayOfWeek
ผู้ใช้

2
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x set today=%Year%-%Month%-%Day% เป็นคำตอบที่ไม่ถูกต้อง: ส่งคืนเดือนและวันหนึ่งหลัก ทำอย่างไรจึงจะได้รับเบาะด้านซ้าย 2 หลักโดยมีสตริงเดือนและวันที่เป็นศูนย์
Andrus

39

หากคุณต้องการบรรลุสิ่งนี้โดยใช้คำสั่ง MS-DOS มาตรฐานในไฟล์แบตช์คุณสามารถใช้:

FOR /F "TOKENS=1 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET dd=%%A
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2,3 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET yyyy=%%C

ฉันแน่ใจว่าสิ่งนี้สามารถปรับปรุงได้ต่อไป แต่สิ่งนี้ทำให้วันที่เป็น 3 ตัวแปรสำหรับวัน (dd) เดือน (มม.) และปี (ปปปป) จากนั้นคุณสามารถใช้สิ่งเหล่านี้ในภายหลังในสคริปต์แบตช์ของคุณได้ตามต้องการ

SET todaysdate=%yyyy%%mm%%dd%
echo %dd%
echo %mm%
echo %yyyy%
echo %todaysdate%

ในขณะที่ฉันเข้าใจว่าคำตอบได้รับการยอมรับสำหรับคำถามนี้วิธีการทางเลือกนี้อาจได้รับการชื่นชมจากหลาย ๆ คนที่ต้องการบรรลุสิ่งนี้โดยไม่ใช้คอนโซล WMI ดังนั้นฉันหวังว่ามันจะเพิ่มคุณค่าให้กับคำถามนี้


3
ฉันพบว่าฉันจำเป็นต้องเปลี่ยนสิ่งนี้เล็กน้อยในกล่อง windows 7 โทเค็นจำเป็นต้องเพิ่มทีละรายการ: ... FOR / F "TOKENS = 2,3,4 eol = / DELIMS = /" ...
Joe Johnston

1
เช่นเดียวกันบนเซิร์ฟเวอร์ Win 2012 บน Azure
Kirill Yunussov

34

ใช้date /Tเพื่อค้นหารูปแบบในพรอมต์คำสั่ง

หากใช้รูปแบบวันที่Thu 17/03/2016ดังนี้:

set datestr=%date:~10,4%-%date:~7,2%-%date:~4,2%
echo %datestr%

1
นี่คือคำตอบที่ใกล้เคียงที่สุดสำหรับคำถามที่ถาม ฉันต้องการซับเพียงบรรทัดเดียวไม่ใช่โปรแกรม
DCookie

2
เห็นด้วย คำตอบบางส่วนมีลักษณะคล้ายกับ "ติดตั้ง MS SQL Server เชื่อมต่อกับไคลเอ็นต์ SQL และดำเนินการคำสั่งSELECT CONVERT(VARCHAR(16), GETDATE(), 112)"
isapir

2
วันที่ - เวลาในรูปแบบ ISO-8601 คือ%date:~10,4%%date:~7,2%%date:~4,2%T%time:~0,2%%time:~3,2%%time:~6,2%
isapir

3
เหตุผลที่คำตอบอื่น ๆ ดูเหมือนโปรแกรมก็คือคำตอบนี้แม้จะเรียบง่าย แต่ก็จะล้มเหลวหากไม่ได้กำหนดค่าการตั้งค่าภูมิภาคของ Windows ในลักษณะที่รหัสนี้คาดหวัง (กล่าวคือรหัสนี้จะใช้ไม่ได้กับทุกระบบ Windows)
Daniel Scott

20

อีกสองวิธีที่ไม่ขึ้นอยู่กับการตั้งค่าเวลา (ทั้งสองอย่างนำมาจากวิธีรับข้อมูล / เวลาที่เป็นอิสระจากการแปล ) และทั้งสองยังได้รับวันในสัปดาห์และไม่ต้องใช้สิทธิ์ผู้ดูแลระบบ!:

  1. MAKECAB - จะทำงานบนระบบ Windows ทุกระบบ (เร็ว แต่สร้างไฟล์ชั่วคราวขนาดเล็ก) (สคริปต์ foxidrive):

    @echo off
    pushd "%temp%"
    makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul
    for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do (
        set "current-date=%%e-%%b-%%c"
        set "current-time=%%d"
        set "weekday=%%a"
    )
    del ~.*
    popd
    echo %weekday% %current-date% %current-time%
    pause
    
  2. ROBOCOPY - มันไม่ได้เป็นคำสั่งพื้นเมืองสำหรับWindows XPและWindows Server 2003 , แต่ก็สามารถดาวน์โหลดได้จากเว็บไซต์ของไมโครซอฟท์ แต่มีอยู่ในตัวทุกอย่างตั้งแต่ Windows Vista ขึ้นไป:

    @echo off
    setlocal
    for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
        set "dow=%%D"
        set "month=%%E"
        set "day=%%F"
        set "HH=%%G"
        set "MM=%%H"
        set "SS=%%I"
        set "year=%%J"
    )
    
    echo Day of the week: %dow%
    echo Day of the month : %day%
    echo Month : %month%
    echo hour : %HH%
    echo minutes : %MM%
    echo seconds : %SS%
    echo year : %year%
    endlocal
    

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

  3. ไฮบริดJScript / BATCH (จำเป็นต้องบันทึกเป็น.bat) JScript พร้อมใช้งานในทุกระบบตั้งแต่Windows NTขึ้นไปโดยเป็นส่วนหนึ่งของWindows Script Host ( แม้ว่าจะสามารถปิดใช้งานผ่านรีจิสทรีได้ก็เป็นกรณีที่หายาก ):

    @if (@X)==(@Y) @end /* ---Harmless hybrid line that begins a JScript comment
    
    @echo off
    cscript //E:JScript //nologo "%~f0"
    exit /b 0
    *------------------------------------------------------------------------------*/
    
    function GetCurrentDate() {
        // Today date time which will used to set as default date.
        var todayDate = new Date();
        todayDate = todayDate.getFullYear() + "-" +
                       ("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" +
                       ("0" + todayDate.getDate()).slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" +
                       ("0" + todayDate.getMinutes()).slice(-2);
    
        return todayDate;
    }
    
    WScript.Echo(GetCurrentDate());
    
  4. ไฮบริดVBScript / BATCH ( เป็นไปได้ไหมที่จะฝังและเรียกใช้ VBScript ภายในไฟล์แบตช์โดยไม่ใช้ไฟล์ชั่วคราว ) กรณีเดียวกับ jscript แต่การไฮบริดไม่สมบูรณ์แบบ:

    :sub echo(str) :end sub
    echo off
    '>nul 2>&1|| copy /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul
    '& echo current date:
    '& cscript /nologo /E:vbscript "%~f0"
    '& exit /b
    
    '0 = vbGeneralDate - Default. Returns date: mm/dd/yy and time if specified: hh:mm:ss PM/AM.
    '1 = vbLongDate - Returns date: weekday, monthname, year
    '2 = vbShortDate - Returns date: mm/dd/yy
    '3 = vbLongTime - Returns time: hh:mm:ss PM/AM
    '4 = vbShortTime - Return time: hh:mm
    
    WScript.echo  Replace(FormatDateTime(Date, 1), ", ", "-")
    
  5. PowerShell - สามารถติดตั้งได้ในทุกเครื่องที่มี. NET - ดาวน์โหลดจาก Microsoft ( v1 , v2และv3 (เฉพาะ Windows 7 ขึ้นไป)) ติดตั้งโดยค่าเริ่มต้นในทุกอย่างในรูปแบบ Windows 7 / Win2008 ขึ้นไป:

    C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
    
  6. jscript.net/batch ที่รวบรวมด้วยตนเอง (ฉันไม่เคยเห็นเครื่อง Windows ที่ไม่มี. NET ดังนั้นฉันคิดว่านี่เป็นเครื่องพกพาที่ค่อนข้างดี):

    @if (@X)==(@Y) @end /****** silent line that start jscript comment ******
    
    @echo off
    ::::::::::::::::::::::::::::::::::::
    :::       Compile the script    ::::
    ::::::::::::::::::::::::::::::::::::
    setlocal
    if exist "%~n0.exe" goto :skip_compilation
    
    set "frm=%SystemRoot%\Microsoft.NET\Framework\"
    :: searching the latest installed .net framework
    for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
        if exist "%%v\jsc.exe" (
            rem :: the javascript.net compiler
            set "jsc=%%~dpsnfxv\jsc.exe"
            goto :break_loop
        )
    )
    echo jsc.exe not found && exit /b 0
    :break_loop
    
    
    call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0"
    ::::::::::::::::::::::::::::::::::::
    :::       End of compilation    ::::
    ::::::::::::::::::::::::::::::::::::
    :skip_compilation
    
    "%~n0.exe"
    
    exit /b 0
    
    
    ****** End of JScript comment ******/
    import System;
    import System.IO;
    
    var dt=DateTime.Now;
    Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
    
  7. Logmanสิ่งนี้ไม่สามารถระบุปีและวันในสัปดาห์ได้ ค่อนข้างช้านอกจากนี้ยังสร้างไฟล์ชั่วคราวและขึ้นอยู่กับการประทับเวลาที่ logman ใส่ในไฟล์บันทึกจะทำงานได้ทุกอย่างตั้งแต่ Windows XP ขึ้นไป มันอาจจะไม่มีใครใช้ - รวมถึงฉันด้วย - แต่มันก็เป็นอีกวิธีหนึ่ง ...

    @echo off
    setlocal
    del /q /f %temp%\timestampfile_*
    
    Logman.exe stop ts-CPU 1>nul 2>&1
    Logman.exe delete ts-CPU 1>nul 2>&1
    
    Logman.exe create counter ts-CPU  -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ >nul
    Logman.exe start ts-CPU 1>nul 2>&1
    
    Logman.exe stop ts-CPU >nul 2>&1
    Logman.exe delete ts-CPU >nul 2>&1
    for /f "tokens=2 delims=_." %%t in  ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') do set timestamp=%%t
    
    echo %timestamp%
    echo MM: %timestamp:~0,2%
    echo dd: %timestamp:~2,2%
    echo hh: %timestamp:~4,2%
    echo mm: %timestamp:~6,2%
    
    endlocal
    exit /b 0
    

ข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชั่นได้รับวันที่



8

ฉันชอบวิธีการของ Joey มาก แต่ฉันคิดว่าฉันจะขยายความอีกหน่อย

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

ทุกครั้งที่คุณเรียกใช้ไฟล์แบตช์นี้ไฟล์จะแสดงวันที่และเวลารวมที่เข้ากันได้กับ ISO 8601

FOR /F "skip=1" %%D IN ('WMIC OS GET LocalDateTime') DO (SET LIDATE=%%D & GOTO :GOT_LIDATE)
:GOT_LIDATE
SET DATETIME=%LIDATE:~0,4%-%LIDATE:~4,2%-%LIDATE:~6,2%T%LIDATE:~8,2%:%LIDATE:~10,2%:%LIDATE:~12,2%
ECHO %DATETIME%

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


5

เพียงใช้%date%ตัวแปร:

echo %date%

5
สิ่งนี้จะส่งคืนวันที่ในรูปแบบวันที่แบบสั้นที่กำหนดค่าไว้ในปัจจุบัน ซึ่งไม่ค่อย ISO-8601
Joey

@Joey ตกลง - ฉันมาที่นี่เพราะไม่ดีพอที่จะพึ่งพา
SteveCinq

5

ตามคำตอบของ @ProVi เพียงแค่เปลี่ยนให้เหมาะกับการจัดรูปแบบที่คุณต้องการ

echo %DATE:~10,4%-%DATE:~7,2%-%DATE:~4,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%

จะกลับมา

yyyy-MM-dd hh:mm:ss
2015-09-15 18:36:11

แก้ไข ตามความคิดเห็น @Jeb ผู้ที่ถูกต้องรูปแบบเวลาข้างต้นจะใช้ได้ก็ต่อเมื่อคำสั่ง DATE / T ของคุณกลับมา

ddd dd/mm/yyyy
Thu 17/09/2015

มันง่ายต่อการแก้ไขเพื่อให้เหมาะกับสถานที่ของคุณอย่างไรก็ตามโดยใช้การสร้างดัชนีของแต่ละอักขระในสตริงที่ส่งคืนโดยตัวแปรสภาพแวดล้อม% DATE% ที่เกี่ยวข้องคุณสามารถแยกส่วนของสตริงที่คุณต้องการได้

เช่น. การใช้% DATE ~ 10,4% จะขยายตัวแปรสภาพแวดล้อม DATE จากนั้นใช้เฉพาะอักขระ 4 ตัวที่ขึ้นต้นด้วยอักขระที่ 11 (ออฟเซ็ต 10) ของผลลัพธ์ที่ขยาย

ตัวอย่างเช่นหากใช้วันที่ที่มีสไตล์ของสหรัฐอเมริกาให้ใช้สิ่งต่อไปนี้

ddd mm/dd/yyyy
Thu 09/17/2015

echo %DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
2015-09-17 18:36:11

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

3

ฉันตั้งค่าตัวแปรสภาพแวดล้อมเป็นค่าในรูปแบบตัวเลขที่ต้องการโดยทำสิ่งนี้:

FOR /F "tokens=1,2,3,4 delims=/ " %a IN ('echo %date%') DO set DateRun=%d-%b-%c

2

เช็คอันนี้ ..

for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" & set "MS=%dt:~15,3%"
set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%-%MS%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause

2

หากคุณติดตั้ง Python ไว้คุณสามารถทำได้

python -c "import datetime;print(datetime.date.today().strftime('%Y-%m-%d'))"

คุณสามารถปรับสตริงรูปแบบตามความต้องการของคุณได้อย่างง่ายดาย


2
การพูดว่า "ใช้ python" เป็นคำตอบของคำถามในทางใด
Ross Presser

3
ในลักษณะเดียวกับการใช้ MAKECAB, ROBOCOPY, VBSCRIPT, POWERSHELL Logman และคำแนะนำอื่น ๆ ที่นี่คุณสามารถเรียกใช้บรรทัดคำสั่งได้หรือไม่?
CodeKid

สิ่งนี้สามารถทำให้ง่ายpython -c "import datetime;print(datetime.date.today())"ขึ้นเนื่องจาก__str__เมธอดของdateคลาสเพียงแค่เรียกisoformat()ใช้
onewhaleid

2

เป็นไปได้ที่จะใช้ PowerShell และเปลี่ยนทิศทางเอาต์พุตไปยังตัวแปรสภาพแวดล้อมโดยใช้ลูป

จากบรรทัดคำสั่ง ( cmd):

for /f "tokens=*" %a in ('powershell get-date -format "{yyyy-MM-dd+HH:mm}"') do set td=%a

echo %td%
2016-25-02+17:25

ในไฟล์แบตช์คุณอาจหลบหนี%aเป็น%%a:

for /f "tokens=*" %%a in ('powershell get-date -format "{yyyy-MM-dd+HH:mm}"') do set td=%%a

1
ควรมาสก์เป็นแบบนี้FOR /F "tokens=*" %%a IN ('powershell get-date -format "{yyyy\-MM\-dd\THH\:mm\:ss}"') DO SET date=%%a ดังนั้นใช้ MM ตัวบนสำหรับเดือนและแบ็กสแลชเพื่อหลีกเลี่ยงอักขระตามตัวอักษร
ใคร

1

เนื่องจากรูปแบบวันที่และเวลาเป็นข้อมูลเฉพาะของสถานที่การดึงข้อมูลจากตัวแปร% date% และ% time% จึงต้องใช้ความพยายามเป็นพิเศษในการแยกวิเคราะห์สตริงที่มีการแปลงรูปแบบเพื่อพิจารณา ความคิดที่ดีคือการใช้ API บางตัวเพื่อดึงโครงสร้างข้อมูลและแยกวิเคราะห์ตามที่คุณต้องการ WMIC เป็นทางเลือกที่ดี ตัวอย่างด้านล่างใช้Win32_LocalTime นอกจากนี้คุณยังสามารถใช้Win32_CurrentTimeหรือWin32_UTCTime

@echo off  
SETLOCAL ENABLEDELAYEDEXPANSION  
for /f %%x in ('wmic path Win32_LocalTime get /format:list ^| findstr "="') do set %%x  
set yyyy=0000%Year%  
set mmmm=0000%Month%  
set dd=00%Day%  
set hh=00%Hour%  
set mm=00%Minute%  
set ss=00%Second%  
set ts=!yyyy:~-4!-!mmmm:~-2!-!dd:~-2!_!hh:~-2!:!mm:~-2!:!ss:~-2!  
echo %ts%  
ENDLOCAL  

ผล:
2018-04-25_10: 03: 11


1

นี่คือส่วนขยายของคำตอบของ Joey เพื่อรวมเวลาและเติมส่วนต่างๆด้วย 0

ตัวอย่างเช่นผลลัพธ์จะเป็น 2019-06-01_17-25-36 โปรดทราบว่านี่เป็นเวลา UTC

  for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x

  set Month=0%Month%
  set Month=%Month:~-2%
  set Day=0%Day%
  set Day=%Day:~-2%
  set Hour=0%Hour%
  set Hour=%Hour:~-2%
  set Minute=0%Minute%
  set Minute=%Minute:~-2%
  set Second=0%Second%
  set Second=%Second:~-2%

  set TimeStamp=%Year%-%Month%-%Day%_%Hour%-%Minute%-%Second%


0

ฉันใช้สิ่งต่อไปนี้:

set iso_date=%date:~6,4%-%date:~3,2%-%date:~0,2%

หรือใช้ร่วมกับชื่อไฟล์บันทึก 'MyLogFileName':

set log_file=%date:~6,4%-%date:~3,2%-%date:~0,2%-MyLogFileName

2
แต่คำตอบของคุณแตกต่างหรือดีกว่าอีก 16 ข้อตรงไหน? และมีคำแนะนำเพียงพออยู่แล้วว่าโซลูชันนี้ใช้ได้กับการแปลของคุณเท่านั้น
jeb

0

หากมี powershell คุณสามารถใช้รหัสด้านล่าง:

# get date
$BuildDate=(get-date -format "yyMMdd")
echo BuildDate=$BuildDate

# get time
$BuildTime=(get-date -format "hhmmss")
echo BuildTime=$BuildTime

นี่คือผลลัพธ์:

BuildDate=200518
BuildTime=115919

-2

หากคุณไม่คำนึงถึงการลงทุนเพียงครั้งเดียว 10 ถึง 30 นาทีเพื่อรับโซลูชันที่เชื่อถือได้ (ซึ่งไม่ได้ขึ้นอยู่กับการตั้งค่าภูมิภาคของ Windows) โปรดอ่านต่อ

ปลดปล่อยจิตใจของเรากันเถอะ คุณต้องการลดความซับซ้อนของสคริปต์ให้มีลักษณะเช่นนี้หรือไม่? (สมมติว่าคุณต้องการตั้งค่าตัวแปร LOG_DATETIME)

FOR /F "tokens=* USEBACKQ" %%F IN (`FormatNow "yyyy-MM-dd"`) DO (
  Set LOG_DATETIME=%%F
)

echo I am going to write log to Testing_%LOG_DATETIME%.log

คุณสามารถ. เพียงสร้าง FormatNow.exe ด้วย C # .NET และเพิ่มลงใน PATH ของคุณ

หมายเหตุ:

  1. คุณสามารถใช้ Visual Studio รุ่นใดก็ได้เช่น Visual Studio Express เพื่อสร้าง FormatNow.exe
  2. ใน Visual Studio ให้เลือกโครงการ C # "แอปพลิเคชันคอนโซล" ไม่ใช่โครงการ "แอปพลิเคชัน Windows Forms"
  3. สามัญสำนึก: FormatNow.exe ที่สร้างขึ้นจะต้องใช้. NET Framework เพื่อเรียกใช้
  4. สามัญสำนึก: หลังจากเพิ่ม FormatNow.exe ไปยังตัวแปร PATH คุณต้องรีสตาร์ท CMD เพื่อให้มีผล นอกจากนี้ยังใช้กับการเปลี่ยนแปลงของตัวแปรสภาพแวดล้อม

สิทธิประโยชน์:

  1. มันไม่ช้า (เสร็จภายใน 0.2 วินาที)
  2. รองรับหลายรูปแบบhttps://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx เช่น FormatNow "ddd" เพื่อรับเฉพาะวันในสัปดาห์ FormatNow "yyyy" เพื่อรับเท่านั้น ปี
  3. ไม่ได้ขึ้นอยู่กับการตั้งค่าภูมิภาคของ Windows ดังนั้นผลลัพธ์จึงน่าเชื่อถือกว่ามาก ในทางกลับกัน% date% ไม่ได้ให้รูปแบบที่สอดคล้องกันบนคอมพิวเตอร์เครื่องอื่นและไม่น่าเชื่อถือ
  4. คุณไม่จำเป็นต้องสร้างตัวแปร CMD จำนวนมากและทำให้เนมสเปซของตัวแปรเป็นมลพิษ
  5. มันจะต้องใช้ 3 บรรทัดใน batch script เพื่อเรียกใช้โปรแกรมและรับผลลัพธ์ ควรสั้นพอสมควร

ซอร์สโค้ดของ FormatNow.exe ซึ่งฉันสร้างด้วย Visual Studio 2010 (ฉันต้องการสร้างด้วยตัวเองเพื่อหลีกเลี่ยงความเสี่ยงในการดาวน์โหลดโปรแกรมที่ไม่รู้จักและอาจเป็นอันตราย) เพียงคัดลอกและวางรหัสด้านล่างสร้างโปรแกรมหนึ่งครั้งจากนั้นคุณจะมีตัวจัดรูปแบบวันที่ที่เชื่อถือได้สำหรับการใช้งานในอนาคตทั้งหมด

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace FormatNow
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                if (args.Length < 1)
                {
                    throw new ArgumentException("Missing format");
                }
                string format = args[0];
                Console.Write(DateTime.Now.ToString(format, CultureInfo.InvariantCulture.DateTimeFormat));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

    }
}

โดยทั่วไปเมื่อจัดการกับลอจิกที่ซับซ้อนเราสามารถทำให้มันง่ายขึ้นได้โดยการสร้างโปรแกรมขนาดเล็กมากและเรียกโปรแกรมเพื่อจับเอาท์พุทกลับไปเป็นตัวแปรสคริปต์แบทช์แทน เราไม่ใช่นักเรียนและเราไม่ได้ทำการสอบที่กำหนดให้เราต้องปฏิบัติตามกฎแบทช์สคริปต์เท่านั้นเพื่อแก้ปัญหา ในสภาพแวดล้อมการทำงานจริงอนุญาตให้ใช้วิธีการใด ๆ (ทางกฎหมาย) เหตุใดเราจึงยังคงยึดติดกับความสามารถที่ไม่ดีของ Windows batch script ที่ต้องการวิธีแก้ปัญหาสำหรับงานง่ายๆหลายอย่าง ทำไมเราจึงควรใช้เครื่องมือที่ไม่ถูกต้องสำหรับงาน?

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