Windows command-line: สร้างไฟล์ที่มีวันที่ปัจจุบันในชื่อของมัน


19

ฉันกำลังพยายามสร้างไฟล์ zip จากชุดสคริปต์ ฉันต้องการชื่อนี้ว่า archive_.zip

น่าเสียดายที่สิ่งนี้ไม่สามารถใช้ได้กับระบบที่มีรูปแบบวันที่เช่น y / m / d เนื่องจากเครื่องหมายทับ:

zip some_options "archive_%DATE%.zip"

%DATE%ตัวแปรขยายไปยังสิ่งที่ต้องการ

Mon 09/28/2009

ฉันมีสิทธิ์เข้าถึงแพ็คเกจ gnuwin32 ดังนั้นฉันสามารถใช้พูดsedเพื่อแทนที่ช่องว่างและเครื่องหมายทับด้วยขีดกลาง ปัญหาคือฉันจะใช้ผลลัพธ์ของsedการสร้างชื่อไฟล์ของไฟล์เก็บถาวร zip ได้อย่างไร

ใน Unix (ทุบตี) เราสามารถใช้ back-quote เพื่อประเมินแทนคำสั่งและใช้เอาต์พุตในคำสั่งอื่นเช่น:

zip [...] archive_`echo %DATE% | sed -e s/.../.../`.zip

มีอะไรที่คล้ายกันใน Windows หรือไม่

หรืออาจจะมีวิธีตั้งค่าตัวแปรให้เป็นค่าที่ส่งคืนsedและใช้เพื่อสร้างชื่อไฟล์

คำตอบ:


27

คุณสามารถแทนที่สัญลักษณ์ในตัวแปรโดยใช้:

set _date=%DATE:/=-%

1
นี่เป็นเคล็ดลับเรียบร้อย!
Cristi Diaconescu

PS มีวิธี 'หนึ่งซับ' เพื่อกำจัดช่องว่างหรือตัวละครที่น่ารังเกียจอื่น ๆ ด้วยหรือไม่ (เมื่อเทียบกับการมีที่ 3 ... ตัวแปรชั่วคราวที่ n สำหรับตัวละครแต่ละตัวที่จะเปลี่ยน)
คริสตี้ Diaconescu

ไม่ล่ะขอบคุณ. ดูเหมือนจะไม่มีสิ่งนั้น คุณต้องย้อนกลับไปที่ไวยากรณ์เพื่อทำสิ่งนั้น หมายเหตุ: นี่คือการอ้างอิงที่ดีสำหรับการเขียนโปรแกรมแบทช์: robvanderwoude.com/batchfiles.php
Christopher

5
มันเร็วกว่า: %date:~-10,2%-%date:~-7,2%-%date:~-4,4% !
Jess Stone

ไม่มีใคร +1 คำตอบของคุณ Jess Stone ได้อย่างไร! +1 จากฉัน !!!
Arvo Bowen

5

ฉันมักจะใช้:

For /f "tokens=1,2,3,4,5 delims=/. " %%a in ('date/T') do set CDate=%%a%%b%%c%%d

จากนั้น CDate จะเป็น Sat02182012 ถ้าคุณต้องการทำให้มันเรียงได้มากขึ้นให้ตั้งค่า CDate เป็น %% d - %% b - %% c ดังนั้นมันจะเป็น 2012-02-18

For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g

เพื่อให้วันที่และเวลาโฟลเดอร์ / ไฟล์เป็นมิตร


4

ผมได้โพสต์คำตอบของคำถามที่คล้ายกันมากที่นี่ spltting ของวันที่ในเขตข้อมูลจะทำใน 1 บรรทัดแทนที่จะเป็นหลายบรรทัดในคำตอบของ harrymc

ส่วนที่น่าสนใจคือ:

@echo off
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd=%%k%%j%%i
echo Date: %yyyymmdd%

และคำเตือนยังคงเกี่ยวข้อง:

คำเตือน : รูปแบบของวันที่ (yyyymmdd = %% k %% j %% i) ขึ้นอยู่กับการตั้งค่าภูมิภาคของคุณ เนื่องจากฉันใช้รูปแบบวันที่แบบฝรั่งเศส (dd / mm / yyyy) ฉันต้องใช้ "%% k %% j %% i" เป็นรูปแบบ (%% i = วัน, %% j = เดือน, %% j = ปี).

หากการตั้งค่าภูมิภาคของคุณถูกกำหนดเป็นสไตล์ของสหรัฐอเมริกา (mm / dd / yyyy) คุณควรใช้ "%% k %% i %% j" (%% i = เดือน, %% j = วัน, %% j = ปี) .



2

รหัสที่ค่อนข้างน่ากลัวควรทำในสิ่งที่คุณต้องการ

move "Filename.txt" "Filename%date:~6,4%%date:~3,2%%date:~0,2%_%Time:~0,2%%Time:~3,2%%Time:~6,2%.txt"

หากคุณเปลี่ยนชื่อไฟล์อย่างเหมาะสม


1
สนใจที่จะอธิบายความโหดร้าย? :)
Cristi Diaconescu

โดยทั่วไปแล้วการตัดบิตออกจากวันที่และป้อนไปที่กลางชื่อไฟล์คุณสามารถทดสอบโดยทำเสียงก้องแล้วส่วนของสยองขวัญที่บรรทัดคำสั่งดังนั้นถ้าคุณทำเสียงสะท้อนวันที่%: ~ 6,4% มันให้ ปี. มันเป็นเพียงการร้อยวันและเวลา
Col

น่าสนใจ ไม่ได้พกพาโชคร้ายเกินไป ...
Cristi Diaconescu

น่าเสียดายที่ปัญหาของการใช้สตริงย่อยนั้นขึ้นอยู่กับรูปแบบวันที่แน่นอนและจะระเบิดเมื่อแตกต่างกัน echo %date:~6,4%%date:~3,2%%date:~0,2%ส่งคืน9-289-20บนเครื่องของฉันเนื่องจากฉันได้ตั้งวันที่ให้ใช้ yyyy-MM-dd (ดังนั้นวันนี้คือ 2009-09-28)
Joshua

จริงฉันใช้โซลูชันนี้กับเครื่องเดียวเท่านั้นดังนั้นจึงไม่ใช่ปัญหามากเกินไป
Col

2

ตั้งแต่คำถามของคุณติดแท็กเป็น Windows ผมพบวิธีแก้ปัญหานี้ที่ทำงานในดีไฟล์ค้างคาวเก่า:
"Windows Batch ไฟล์ (ค้างคาว) เพื่อให้ได้วันที่ปัจจุบันในรูปแบบ MMDDYYYY" ,
และอาจจะสามารถนำไปปรับใช้กับกรณีของคุณ:

echo บน
ชุดวันที่ที่รวดเร็วของ @REM Seamonkey (รูปแบบ MMDDYYYY)
@REM การตั้งค่าตัวแปร% วันที่
@REM แยกวิเคราะห์วันที่เดือนวันและปีในรูปแบบ mm, dd, yyyy และรวมเป็น MMDDYYYY

FOR / F“ TOKENS = 1 * DELIMS =” %% A IN ('DATE / T') ตั้ง CDATE = %% B
สำหรับ / F“ TOKENS = 1,2 eol = / DELIMS = /” %% A IN ( 'DATE / T') ทำ SET mm = %% B
สำหรับ / F“ TOKENS = 1,2 DELIMS = / eol = /” %% A IN ('echo% CDATE%') ทำการ SET dd = %% B
FOR / F“ TOKENS = 2,3 DELIMS = /” %% A IN ('echo% CDATE%') ทำการ SET yyyy = %% Bv vSET วันที่ =% mm %% dd %% yyyy%

สิ่งนี้ไม่ทำอะไรเลยนอกจากตั้งค่าตัวแปร% date เป็นวันที่ปัจจุบันในรูปแบบ MMDDYYYY เพื่อให้สามารถเรียกได้ในภายหลังในสคริปต์

แก้ไข
พบไวยากรณ์ที่ดีกว่า ระบุว่าวันที่ของฉันคือวันนี้ "จันทร์ 28/09/2009":
set day =% วันที่: ~ 0,2%
set month =% วันที่: ~ 7,2%
set year =% วันที่: ~ 10,4%


2

รุ่น cmd.exe ที่บริสุทธิ์พร้อมกับ gnuwin32- 'วันที่':

%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do zip archive_%d.zip <folder>

ดังนั้นจึงสามารถทำการทดแทนแบบแทนที่! หากคุณถามฉันคำสั่ง 'สำหรับ' มีไวยากรณ์แปลกหนึ่ง ...
Cristi Diaconescu

ฉันไม่ได้อ้างว่ามันเป็นไปไม่ได้ :) สิ่ง 'cmd' ทั้งหมดนั้นบ้าไปแล้วใครก็ตามที่ออกแบบให้ลึกลงไปในความฝันที่เลวร้าย คำว่า 'for' cmd สร้างเส้น (หรือที่เรียกว่า 'unrolls' the 'loop') ในรอบแรกและจากนั้นเรียกใช้สคริปต์ 'created' ที่สร้างขึ้น
akira

1

แล้วการใช้ cscript + vbasic:

WScript.shell.run "zip archive_" & DatePart("yyyy", Now) & "_" & DatePart("m", Now) & "_" & DatePart("d", Now) & ".zip " & WScript.arguments(0)

เรียกมันผ่าน

cscript /nologo zip_it.vbs

1

สำหรับ / f "โทเค็น = 1,2,3,4,5 delims = /." %% a ใน ('date / T') ตั้ง CDate = %% d - %% b - %% c

@echo data =% CDate%

นี่คือในปีเดือนวันที่พบมากที่สุดในขณะนี้วัน


1

โซลูชันใด ๆ ที่ใช้อย่างใดอย่างหนึ่ง%DATE%หรือเอาท์พุทของdate /tมีแนวโน้มที่จะแตกถ้าผู้ใช้ปรับเปลี่ยนการตั้งค่าภูมิภาคของเขา / เธอ ตัวอย่างเช่นฉันได้ตั้งค่ารูปแบบ "วันที่แบบสั้น" เป็น"yyyy-MM-dd"ดังนั้นฉันจึงมี%DATE%ค่าเท่ากับ"2012-02-18"และdate /tสร้างผลลัพธ์เดียวกัน (นี่สำหรับ Windows 7; ฉันถือว่ามันเหมือนกันกับ Windows รุ่นก่อนหน้า)

สร้างไฟล์แบตช์แล้วดำเนินการ

เนื่องจากคุณมีdateคำสั่งGNU อยู่คุณจึงสามารถทำสิ่งนี้:

C:\path\to\gnu\date "+zip some_options archive_%Y-%m-%d.zip" > tmp.bat
call .\tmp.bat

tmp.bat จะมีบางสิ่งที่ชอบ:

zip some_options archive_2012-02-18.zip

โปรดทราบว่าสิ่งนี้จะสร้างtmp.batในไดเรกทอรีปัจจุบันซึ่งอาจเป็นปัญหา %TEMP%\tmp.batมันอาจจะดีกว่าที่จะสร้าง ฉันยังไม่ได้ลบไฟล์หลังจากนั้น ง่ายพอที่จะทำ

date +FORMATให้คุณระบุรูปแบบเอาต์พุตของdateคำสั่งคล้ายกับprintfสตริงรูปแบบ ดูเอกสารวันที่ coreutilsสำหรับรายละเอียด sedรูปแบบที่สามารถใส่ข้อความโดยพลการดังนั้นในกรณีนี้คุณไม่จำเป็นต้องแม้กระทั่งการใช้งาน


1

ฉันเดาว่าถ้าคุณรวบรวมทุกคนเข้าด้วยกันคุณจะได้อะไรที่เหมาะกับคุณ นี่เป็นระบบ Windows 2003 ที่ให้ภาพรวมของกระบวนการทำงานที่ตอบสนองต่อการทริกเกอร์จากการตรวจสอบประสิทธิภาพ:

@echo off
For /f "tokens=1,2,3,4,5 delims=/. " %%i in ('date /t') do set CDate=%%k%%j%%i
For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g
tasklist /fo table >tasklist%CDate%%CTime%.txt

ไฟล์เอาต์พุตมีชื่อในหนึ่งสตริงโดยไม่มีตัวคั่น


0
zip [...] archive_`echo %DATE% | tr / -`.zip

ควรทำงาน.

ในทางกลับกัน - คุณอาจมีdateคำสั่งอยู่ (ฉันไม่รู้จัก Windows) ถ้าใช่ให้ทำดังนี้

zip [...] archive_`date +'%Y-%m-%d'`.zip

เคล็ดลับ backtick ไม่ทำงานใน cmd.exe และคำสั่ง 'วันที่' ของ Windows ไม่สามารถจัดการกับการจัดรูปแบบ :(
Cristi Diaconescu

-1

ไม่แน่ใจว่าเหมาะสมกับคุณหรือไม่ แต่รหัสของฉันคือ

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

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