การใช้วันที่และเวลาในแบตช์ไฟล์เพื่อสร้างชื่อไฟล์


20

ฉันใช้งานโปรแกรมจากแฟ้มแบตช์ซึ่งเมื่อเสร็จสิ้นแล้วจะทำการสำรองข้อมูลอัตโนมัติของฐานข้อมูล MySQL ของฉัน

ฉันต้องการแบตช์ไฟล์เพื่อสร้างการสำรองข้อมูลที่แตกต่างกันสำหรับการทำงานแต่ละครั้งดังนั้นฉันสามารถย้อนกลับได้

ชื่อไฟล์ที่ต้องการจะเป็น gnucash_shockwave-20121128210344.sql (รูปแบบวันที่ YYYY-MM-DD-HH-MM-SS)

ฉันลองทำบางสิ่งที่บอกว่าลอง%DATE:~4%แล้ว%Date.Year%แต่ได้รับข้อผิดพลาดที่แจ้งThe system cannot find the specified path.

หากฉันลบความพยายามในการประทับเวลาสคริปต์ทำงานได้ดี แต่เขียนทับข้อมูลสำรองก่อนหน้า

นี่คือส่วนของรหัสที่ฉันพูดถึง:

@REM *** EXECUTION ***
echo. Starting backup...
SET timestamp %DATE:~-4%%DATE:~4,2%%DATE:~7,2%%TIME%
%mysqldir%\mysqldump -u %mysqluser% -p%mysqlpassword% -h %mysqlhost% -P %mysqlport% --databases --routines --verbose gnucash_shockwave > %BackupDir%\gnucash_shockwave-%timestamp%.sql

echo.------------------------------------------------------
echo. Backup complete!

ข้อเสนอแนะใด ๆ


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

slhck, lol ขอบคุณฉันสงสัยว่าเกิดอะไรขึ้นแล้วฉันจำได้ว่าฉันไม่ได้อยู่ที่กองล้น lol
guyfromfl

แทนที่% วันที่% โดย% วันที่: ~ 6,4% - วันที่%: ~ 3,2% - วันที่%: ~ 0,2% ทำงาน
MagTun

คำตอบ:


27

รูปแบบวันที่และเวลาขึ้นอยู่กับสิ่งที่คุณระบุในแอปเพล็ตแผงควบคุมภูมิภาคและภาษา

เรียกใช้ไฟล์แบตช์ต่อไปนี้ (ซึ่งถือว่าdd / mm / yyyyและhh: mm: ss ) และปรับเปลี่ยนการแยกสตริงย่อย (โดยใช้อักขระ: และ ~) ตามต้องการเพื่อรับชิ้นส่วนที่เหมาะสมจากทั้งสตริงวันที่และเวลา:

@echo off
cls
echo Date format = %date%
echo dd = %date:~0,2%
echo mm = %date:~3,2%
echo yyyy = %date:~6,4%
echo.
echo Time format = %time%
echo hh = %time:~0,2%
echo mm = %time:~3,2%
echo ss = %time:~6,2%
echo.
echo Timestamp = %date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%

สำหรับความช่วยเหลือเพิ่มเติมเกี่ยวกับการแยกสตริงย่อยให้พิมพ์set /?ที่พรอมต์คำสั่งหรือดูหน้านี้


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

เข้าใจแล้วต้องบิดตำแหน่งสตริงของวันที่อาจเป็นเพราะสถานที่และภาษาของฉัน แต่นั่นก็หลอกลวง! ขอบคุณมาก!
guyfromfl

เพื่อให้ได้วันที่ที่ไม่ขึ้นกับท้องถิ่นให้ใช้wmicแทน
phuclv

วิธีนี้สามารถให้ผลลัพธ์ที่แตกต่างกันในเครื่องที่แตกต่างกัน
Mehdi Dehghani

1
ผมคิดว่าสิ่งที่มีการเปลี่ยนแปลงกับการส่งออกวันที่ฉันได้รับการผลิต> echo yyyy = %DATE:~6,4% yyyy = /20/อย่างไรก็ตามเป็นecho yyyy = %DATE:~10,4% yyyy = 2019
teeks99

7

นี่คือสิ่งที่ทำงานสำหรับฉัน

Format - mmddyyyy_HHMMSS

echo %DATE% %TIME%

Date format = Thu 03/05/2015 15:48:26.22

echo mm = %date:~4,2%

echo dd = %date:~7,2%

echo yyyy = %date:~10,4%

echo Timestamp = %date:~4,2%%date:~7,2%%date:~10,4%_%time:~0,2%%time:~3,2%%time:~6,2%

Timestamp - 03052015_154013

3
ยินดีต้อนรับสู่ Super User! คุณกรุณาแก้ไขคำตอบของคุณเพื่อรวมคำอธิบายเกี่ยวกับคำสั่งของคุณได้ไหม
Excellll

คุณกำลังตอบคำถามที่ผิด คำถามของ OP ขอ YYYYMMDD; คำตอบนี้ให้ MMDDYYYY
สกอตต์

ไม่มีอะไรที่เหมือนกับการมาสแต็คกับคำถามและมีคำตอบที่สมบูรณ์แบบเพียงแค่นั่งรอที่นั่นเพื่อช่วยชีวิตฉันไว้ ขอบคุณ @abbs และ Excelll มาก
clockwiseq

3

ด้วยการปรับเปลี่ยนเล็กน้อยฉันได้รับสิ่งนี้

@echo off
cls
echo Date format = %date%
echo dd = %date:~0,2%
echo mm = %date:~3,2%
echo yyyy = %date:~6,8%
echo.
echo Time format = %time%
echo hh = %time:~0,2%
echo mm = %time:~3,2%
echo ss = %time:~6,2%
echo.
echo Timestamp = %date:~0,2%_%date:~3,2%_%date:~6,8%-%time:~0,2%_%time:~3,2%_%time:~6,2%
ECHO "TEST..." > test-%date:~0,2%_%date:~3,2%_%date:~6,8%-%time:~0,2%_%time:~3,2%_%time:~6,2%.txt


ผลลัพธ์:

"test-do_25_06-2015-22_21_51.txt" (Thursday_25th_June_2015-22:21.51)


สิ่งนี้แตกต่างจากคำตอบอื่น ๆ อย่างไร
สงสัย

@suspectus: คำตอบนี้แตกต่างจากคำตอบของ abbs ใน abbs นั้นสมมติว่าเป็นภูมิภาคของสหรัฐอเมริกา (เช่นโลแคล) โดยที่%DATE%~ Ddd MM/DD/YYYYในขณะที่อันนี้ถือว่าเป็นเขตที่ไม่ใช่ของสหรัฐฯโดยที่%DATE%~ DD/MM/YYYY(ไม่มีวันในสัปดาห์) และอันนี้ต่างจากคำตอบของ Karan ในที่นี้ว่าผิด - คำถามถาม YYYYMMDD; คำตอบนี้ให้ DD_MM – YYYY
สกอตต์

2

ขออภัยในความล่าช้า dthe ...

วิธีที่เชื่อถือได้เพียงวิธีเดียวในการรับวันที่เหมาะสมไม่ว่าการตั้งค่าภูมิภาคคือโซลูชันของ foxidrive @ /programming/11037831/filename-timestamp-in-windows-cmd-batch-script

@echo off
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 "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause

1

ฉันคิดว่าสิ่งนี้จะช่วยปรับปรุง @Nick Rogers ตอบเล็กน้อย

ตัวอย่าง: เมื่อใช้ตำแหน่งภาษาเยอรมัน (de_DE) จะมีช่องว่างนำหน้าในเวลาต่ำกว่า 10

ฉันยังต้องการศูนย์นำในชั่วโมง "echo -! ^ _ hh! -" ให้ "09" แทน "9" เท่านั้น

ดังนั้นฉันแบ่งรหัสออกเป็นสองส่วนเพื่อการอ่านที่ดีขึ้น ตัวอย่างนี้ควรตรงกับตำแหน่งที่ตั้งเพิ่มเติม

+ โบนัส: _ms = มิลลิวินาทีหรือตัวเลขสองหลักสุดท้ายคือ (-;

หมายเหตุ: บางครั้งต้องใช้เวลา HOUR เพื่อดูรหัสภายใน

SETLOCAL
SETLOCAL EnableExtensions
SETLOCAL EnableDelayedExpansion
@ECHO ON
@rem use FOR /F to 'break out' the components of %DATE% and %TIME%, assuming 'yyyy/mm/dd' format date i.e.
@rem works also with german standard format dd.mm.yyyy

echo ----- date -----
    echo _%date%_
    for /F "tokens=1-3 delims=.-/" %%i IN ("%date%") DO Set "_Y=%%i"& Set "_M=%%j"& Set "_D=%%k"
    @rem Switch the year and day if appropriate
    IF "xx%_D:~2%" == "xx" Set "_Y=%_D%"& Set "_D=%_Y%"
    set __date=%_Y%%_M%%_D%
    echo _%__date%_
echo ----- date -----

echo ----- time -----
    echo _%time%_
    for /F "tokens=1-4 delims=:," %%l IN ("%time%") DO Set "_tmp_hh=%%l"& Set "_mm=%%m"& Set "_ss=%%n"& Set "_ms=%%o"
    @rem add leading zero to hour if necessary
    if %_tmp_hh% LSS 10 (set _hh=^0%_tmp_hh:~1,1%) ELSE (set _hh=%time:~0,2%)
    @rem sometimes the HOUR needs to be escaped, like this
    echo - !^_hh! -
    set __time=%_hh%%_mm%%_ss%%_ms%
    echo _%__time%_
echo ----- time -----

    Set fullTime=%_Y%%_M%%_D%-%_hh%%_mm%%_ss%%_ms%
    echo _%fullTime%_
pause

เอาต์พุต: echo fullTime = 15062018-10182821


0

คำตอบที่สั้นที่สุด (อเนกประสงค์ที่สุด) เป็นไปตามสคริปต์ TimeStamp.cmd ต่อไปนี้ซึ่งมีโค้ดเพียงสามบรรทัด (ไม่รวมข้อคิดเห็น ฯลฯ ) ...

@ECHO ON
@REM use FOR /F to 'break out' the components of %DATE% and %TIME%, assuming 'yyyy/mm/dd' format date i.e.

    for /F "tokens=1-6* delims=.:-/ " %%i IN ("%DATE% %TIME%") DO Set "YYYY=%%i"& Set "MM=%%j"& Set "DD=%%k"& Set "HH=%%l"& Set "MI=%%m"& Set "SS=%%n"

@REM Switch the year and day if appropriate

    IF NOT "X%DD:~2%" == "X" Set "YYYY=%DD%"& Set "DD=%YYYY%"

    Set "TimeStamp=%YYYY%%MM%%DD%%HH%%MI%%SS%"

สังเกตความจำเป็นในการใช้ %% มากกว่า% สำหรับตัวแปรในคำสั่ง FOR ในไฟล์แบตช์

... ผลตอบแทนการดำเนินการ (ลบบรรทัดว่างและความคิดเห็น) ...

C:\>timestamp.cmd
C:\>for /F "tokens=1-6* delims=.:-/ " %i IN ("2018/03/02 11:17:43.35") DO Set "YYYY=%i"  & Set "MM=%j"  & Set "DD=%k"  & Set "HH=%l"  & Set "MI=%m"  & Set "SS=%n"
C:\>Set "YYYY=2018"  & Set "MM=03"  & Set "DD=02"  & Set "HH=11"  & Set "MI=17"  & Set "SS=43"
C:\>IF NOT "X" == "X" Set "YYYY=02"  & Set "DD=2018"
C:\>Set "TimeStamp=20180302111743"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.