Baris perintah Windows: buat file dengan tanggal saat ini dalam namanya

19

Saya mencoba membuat file zip dari skrip batch. Saya perlu diberi nama seperti archive_.zip

Sayangnya, ini tidak berfungsi pada sistem dengan tanggal yang diformat seperti y / m / d karena garis miring:

zip some_options "archive_%DATE%.zip"

The %DATE%variabel memperluas untuk sesuatu seperti

Mon 09/28/2009

Saya memiliki akses ke paket gnuwin32, jadi saya bisa menggunakan, katakanlah, seduntuk mengganti spasi dan garis miring dengan garis putus-putus . Masalahnya adalah, bagaimana saya akan menggunakan output seduntuk membuat nama file arsip zip?

Di Unix (bash), seseorang dapat menggunakan tanda kutip kembali untuk mengevaluasi di tempat perintah dan menggunakan hasilnya di perintah lain, sesuatu seperti:

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

Apakah ada yang serupa di Windows?

Atau mungkin ada cara untuk mengatur variabel ke nilai yang dikembalikan seddan menggunakannya untuk membangun nama file?

Cristi Diaconescu
sumber

Jawaban:

27

Anda dapat mengganti simbol dalam variabel dengan menggunakan:

set _date=%DATE:/=-%
Christopher
sumber
1
Ini trik yang rapi!
Cristi Diaconescu
PS Apakah ada cara 'satu garis' untuk menghilangkan spasi atau karakter jahat lainnya juga? (sebagai lawan untuk memiliki 3 sebuah ... variabel temp n untuk setiap karakter untuk menggantikan)
Cristi Diaconescu
Tidak maaf Sepertinya tidak ada hal seperti itu. Anda harus mundur ke sintaks untuk melakukan itu. NB: Ini adalah referensi yang bagus untuk batch-programming: robvanderwoude.com/batchfiles.php
Christopher
5
ini bahkan lebih cepat daripada %date:~-10,2%-%date:~-7,2%-%date:~-4,4% :!
Jess Stone
Bagaimana tidak ada yang memberi +1 pada respons Anda Jess Stone! +1 dari saya !!!
Arvo Bowen
5

Saya selalu menggunakan:

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

Maka CDate akan menjadi Sat02182012. Jika Anda ingin membuatnya lebih mudah, atur CDate ke %% d - %% b - %% c sehingga akan menjadi 2012-02-18

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

Untuk membuat folder dan file ramah tanggal dan waktu.

pemalas
sumber
4

Saya telah mengirim jawaban untuk pertanyaan yang sangat mirip di sini . Pemisahan tanggal di bidang dilakukan dalam 1 baris, alih-alih beberapa baris dalam jawaban harrymc.

Bagian yang menarik adalah:

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

Dan peringatan itu masih relevan:

Peringatan : format tanggal (yyyymmdd = %% k %% j %% i) tergantung pada pengaturan regional Anda. Karena saya menggunakan format tanggal Prancis (dd / mm / yyyy), saya harus menggunakan "%% k %% j %% i" sebagai format (%% i = hari, %% j = bulan, %% j = tahun).

Jika pengaturan regional Anda disetel ke gaya AS (mm / hh / tttt), Anda harus menggunakan "%% k %% i %% j" (%% i = bulan, %% j = hari, %% j = tahun) .

Snark
sumber
3
zip some_options "archive_%date:/=-%.zip"

yang /=-menggantikan orang /dengan tanda minus.

Theo
sumber
2

Sedikit kode yang mengerikan ini harus melakukan sesuatu seperti yang Anda inginkan

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

Jika Anda mengubah nama file dengan tepat.

Kol
sumber
1
Ingin menjelaskan keburukan itu? :)
Cristi Diaconescu
Ini pada dasarnya memotong bit dari tanggal dan memasukkannya ke tengah nama file, Anda dapat mengujinya dengan melakukan gema kemudian bagian-bagian horor pada baris perintah jadi jika Anda melakukan gema% tanggal: ~ 6,4% itu memberikan tahun. Itu hanya substring tanggal dan waktu.
Kol.
Menarik. Tidak terlalu portabel sayangnya ...
Cristi Diaconescu
Sayangnya masalah dengan menggunakan substring adalah bahwa hal itu bergantung pada format tanggal tertentu, dan meledak ketika berbeda. echo %date:~6,4%%date:~3,2%%date:~0,2%kembali 9-289-20pada mesin saya karena saya memiliki tanggal yang ditetapkan untuk menggunakan yyyy-MM-dd (jadi hari ini adalah 2009-09-28).
Joshua
Benar, saya hanya menggunakan solusi ini pada satu mesin sehingga tidak terlalu menjadi masalah.
Kolonel
2

Karena pertanyaan Anda ditandai sebagai Windows, saya menemukan solusi ini yang berfungsi dalam file .bat lama yang baik:
"File Batch Windows (.bat) untuk mendapatkan tanggal saat ini dalam format MMDDYYYYY" ,
dan mungkin dapat disesuaikan dengan kasus Anda:

gema pada
batch tanggal cepat @REM Seamonkey (format MMDDYYYYY)
@REM Setup% variabel tanggal
@REM Mem-parsing bulan, hari, dan tahun ke dalam mm, dd, format tttt dan kemudian bergabung menjadi MMDDYYYYY

UNTUK / F "TOKENS = 1 * DELIMS =" %% A IN ('DATE / T') LAKUKAN SET CDATE = %% B
UNTUK / F "TOKENS = 1,2 eol = / DELIMS = /" %% A IN ( 'DATE / T') SET SET mm = %% B
UNTUK / F "TOKENS = 1,2 DELIMS = / eol = /" %% A IN ('echo% CDATE%') DO SET SET dd = %% B
UNTUK / F "TOKENS = 2,3 DELIMS = /" %% A IN ('echo% CDATE%') LAKUKAN SET yyyy = %% Bv tanggal vSET =% mm %% dd %% yyyy%

ini tidak melakukan apa-apa selain mengatur variabel% date menjadi todays date dalam format MMDDYYYY sehingga dapat dipanggil nanti dalam skrip.

Sunting
Ditemukan sintaks yang lebih baik. Mengingat tanggal saya hari ini "Senin 28/09/2009":
set hari =% Tanggal: ~ 0,2%
set bulan =% Tanggal: ~ 7,2%
set tahun =% Tanggal: ~ 10,4%

harrymc
sumber
2

versi cmd.exe murni dalam kombinasi dengan gnuwin32-'date ':

%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do zip archive_%d.zip <folder>
akira
sumber
Sehingga bisa melakukan substitusi di tempat! Jika Anda bertanya kepada saya, perintah 'untuk' memiliki satu sintaks aneh ...
Cristi Diaconescu
Saya tidak mengklaim itu tidak bisa :) seluruh barang 'cmd' itu gila, siapa pun yang merancang itu jauh ke dalam semacam mimpi buruk. cmd 'for' benar-benar membuat baris (alias 'membuka gulungan' 'loop') di pass pertama dan kemudian mengeksekusi skrip yang begitu 'dibuat'.
akira
1

bagaimana dengan menggunakan cscript + vbasic:

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

sebut itu via

cscript /nologo zip_it.vbs
akira
sumber
1

Untuk / f "token = 1,2,3,4,5 delims = /." %% a in ('date / T') lakukan set CDate = %% d - %% b - %% c

@echo data =% CDate%

Ini adalah Tahun-Bulan-Hari yang paling umum sekarang hari


sumber
1

Solusi apa pun yang menggunakan salah satu %DATE%atau output dari date /tkemungkinan akan rusak jika pengguna telah memodifikasi pengaturan regionalnya. Sebagai contoh, saya telah mengatur format "tanggal pendek" saya "yyyy-MM-dd", jadi saya memiliki nilai yang %DATE%sama dengan "2012-02-18", dan date /tmenghasilkan output yang sama. (Ini untuk Windows 7; Saya kira itu sama untuk versi Windows sebelumnya.)

Buat file batch dan kemudian jalankan.

Karena Anda memiliki dateperintah GNU yang tersedia, Anda dapat melakukan sesuatu seperti ini:

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

tmp.bat akan mengandung sesuatu seperti:

zip some_options archive_2012-02-18.zip

Perhatikan bahwa ini dibuat tmp.batdi direktori saat ini, yang mungkin menjadi masalah; mungkin lebih baik untuk dibuat %TEMP%\tmp.bat. Saya juga tidak menghapus file sesudahnya; itu cukup mudah untuk dilakukan.

date +FORMATmemungkinkan Anda menentukan format output dari dateperintah, mirip dengan printfstring format; lihat dokumentasi tanggal coreutils untuk perinciannya. Format dapat menyertakan teks arbitrer, jadi dalam hal ini Anda bahkan tidak perlu menggunakan sed.

Keith Thompson
sumber
1

Saya kira, jika Anda menggabungkan bit semua orang Anda mendapatkan sesuatu yang bekerja untuk Anda. Ini ada pada sistem Windows 2003 untuk memberi saya gambaran proses yang berjalan sebagai respons terhadap pemicu dari monitor kinerja:

@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

File output dinamai dalam satu string tanpa pembatas.

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

Harus bekerja

Di sisi lain - mungkin Anda memiliki dateperintah yang tersedia (saya tidak tahu Windows). Jika ya, maka lakukan saja:

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

sumber
Trik backtick tidak berfungsi di cmd.exe. Dan perintah 'tanggal' Windows tidak dapat menangani pemformatan :(
Cristi Diaconescu
-1

tidak yakin apakah itu cocok untuk Anda, tetapi kode saya

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
Kelly
sumber
OP menginginkan file dengan tanggal saat ini dalam nama file , bukan dalam isi file
Jan Doggen