Menggunakan Tanggal dan Waktu dalam file batch untuk membuat nama file

20

Saya menjalankan program dari file batch, yang ketika selesai melakukan pencadangan otomatis database MySQL saya.

Saya ingin file batch untuk membuat cadangan yang berbeda untuk setiap proses, sehingga saya dapat melacak balik.

Nama file yang diinginkan adalah gnucash_shockwave-20121128210344.sql (Format tanggal YYYY-MM-DD-HH-MM-SS)

Saya telah googled beberapa hal yang mengatakan mencoba %DATE:~4%dan %Date.Year%tetapi saya mendapatkan kesalahan yang mengatakanThe system cannot find the specified path.

Jika saya menghapus upaya untuk cap waktu itu, skrip berfungsi dengan baik, tetapi lebih dari menulis cadangan sebelumnya

Ini adalah bagian dari kode yang saya bicarakan:

@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!

Ada saran?

guyfromfl
sumber
Saya telah menghubungkan kembali akun Anda, Anda harus dapat masuk dan mengomentari pos Anda sendiri dan jawaban atas pertanyaan Anda sekarang.
slhck
slhck, lol terima kasih saya bertanya-tanya apa yang sedang terjadi kemudian saya ingat saya tidak berada di stack overflow lol
guyfromfl
mengganti% tanggal% dengan% tanggal: ~ 6,4% -% tanggal: ~ 3,2% -% tanggal: ~ 0,2% berhasil
MagTun

Jawaban:

28

Format Tanggal dan Waktu tergantung pada apa yang Anda tentukan di applet Panel Kontrol Wilayah dan Bahasa .

Jalankan file batch berikut (yang mengasumsikan dd / mm / yyyy dan jj: mm: dd ) dan memodifikasi ekstraksi substring (menggunakan: dan ~ karakter) sebagaimana diperlukan untuk mendapatkan bagian yang tepat dari string Tanggal dan Waktu:

@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%

Untuk bantuan lebih lanjut tentang ekstraksi substring, ketik set /?di command prompt atau lihat halaman ini .

Karan
sumber
Terima kasih, saya rasa saya mengerti bagaimana ini bekerja sekarang. Saya tidak di kantor, tetapi akan mencobanya segera setelah saya sampai di sana dan mengirim kembali. Kami menggunakan Windows 8 Terima kasih atas bantuannya
guyfromfl
Mengerti, Harus mengubah lokasi string tanggal, mungkin karena lokasi dan bahasa saya tapi itu berhasil! Terima kasih banyak!
guyfromfl
Untuk mendapatkan tanggal independen-lokal, gunakan wmic sebagai gantinya
phuclv
Solusi ini dapat memberikan hasil berbeda pada mesin yang berbeda.
Mehdi Dehghani
Saya pikir ada sesuatu yang berubah dengan output tanggal, saya bisa > echo yyyy = %DATE:~6,4%menghasilkan yyyy = /20/. Namun echo yyyy = %DATE:~10,4%adalah yyyy = 2019.
teeks99
7

Inilah yang bekerja untuk saya.

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
abb
sumber
3
Selamat Datang di Pengguna Super! Bisakah Anda mengedit jawaban Anda untuk memasukkan beberapa penjelasan tentang apa yang perintah Anda lakukan?
Excellll
Anda menjawab pertanyaan yang salah. Pertanyaan OP menanyakan YYYYMMDD; jawaban ini memberi MMDDYYYY.
Scott
tidak seperti datang ke Stack dengan sebuah pertanyaan dan memiliki jawaban sempurna hanya duduk di sana menunggu untuk menyelamatkan hari untukku. Terima kasih banyak @abbs dan Excelll
clockwiseq
3

Dengan sedikit penyesuaian saya dapat ini

@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


Hasil:

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

André Verwijs
sumber
Apa bedanya dengan jawaban lainnya?
tersangka
@suspectus: Jawaban ini berbeda dari jawaban abbs di mana abbs mengasumsikan Wilayah AS (yaitu, lokal), di mana %DATE%~ Ddd MM/DD/YYYY, sedangkan yang ini mengasumsikan Wilayah non-AS, di mana %DATE%~ DD/MM/YYYY(tanpa hari dalam seminggu). Dan yang ini berbeda dari jawaban Karan karena yang ini salah - pertanyaannya meminta YYYYMMDD; jawaban ini memberi DD_MM – YYYY.
Scott
2

Maaf atas keterlambatan ...

Satu-satunya cara yang dapat diandalkan untuk mendapatkan tanggal yang sesuai apapun pengaturan regional adalah solusi dari 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
Eric Ouellet
sumber
1

Saya pikir ini meningkatkan jawaban Rogers @Nick sedikit.

EX: dengan locat Jerman (de_DE) ada spasi putih terkemuka pada jam di bawah 10.

Saya juga ingin memimpin nol pada jam tersebut. "echo -! ^ _ hh! -" memberikan "09" bukan hanya "9"

jadi saya memecahkan kode menjadi dua bagian untuk bacaan yang lebih baik. contoh ini harus cocok dengan lebih banyak lokal.

+ bonus: _ms = milidetik atau apa pun dua digit terakhirnya (-;

komentar: terkadang JAM perlu melarikan diri, lihat di dalam kode

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

output: gema fullTime = 15062018-10182821

le luxe fou
sumber
0

jawaban terpendek (paling fleksibel?) adalah sesuai dengan skrip TimeStamp.cmd berikut yang hanya berisi tiga baris kode (tidak termasuk komentar, dll.) ...

@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%"

Perhatikan kebutuhan untuk menggunakan %% daripada% untuk variabel dalam pernyataan FOR dalam file batch

... hasil eksekusi (baris kosong dan komentar dihapus) ...

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"
Nick Rogers
sumber