Catat tanggal dan waktu secara akurat dengan file batch

1

Saya memiliki file batch yang membuat cadangan file saya dan berfungsi dengan baik, namun saya ingin dapat mencatat waktu yang tepat setiap tugas dimulai, tetapi tidak berfungsi seperti yang saya harapkan.

@echo off
> C:\log\%date:~3,2%-%date:~0,2%.log (
echo %time% - Backing up first part
... some logic
echo %time% - Backing up second part
... 
)

Masalahnya adalah saya mendapatkan waktu yang persis sama untuk kedua contoh% time%, alih-alih menampilkan waktu yang tepat seperti yang saya inginkan.

Saya menganggap itu ada hubungannya dengan ekspansi yang tertunda, mungkin DOS memberikan nilai ke waktu pertama kali dan menjaga nilai itu sepanjang seluruh file.

Apa yang harus saya lakukan untuk dapat mencerminkan waktu di mana gema sebenarnya disebut?

Luis Esparza LeedMx
sumber

Jawaban:

5

Klasik masalah ekspansi tertunda.

Masalahmu adalah itu %time% ekspansi terjadi ketika pernyataan diuraikan, dan seluruh blok di-kurung diuraikan pada saat yang sama, sebelum perintah dijalankan.

Ada tiga solusi yang mungkin:

1) Gunakan TIME /T sebagai gantinya

Ini menghindari seluruh masalah waktu ekspansi. Tetapi formatnya berbeda, dan ada baris baru setelahnya, jadi Anda tidak dapat menambahkan label di akhir.

time /t
echo Backing up first part

Jika Anda ingin label pada baris yang sama, maka Anda dapat membalik urutan dan menggunakan SET / P

<nul set /p "Backing up first part - "
time /t

Atau Anda dapat menangkap output dengan loop FOR / F dan meletakkan semuanya pada satu baris

for /f "delims=" %%T in ('time /t') do echo %%T - Backing up first part:

2) Gunakan PANGGILAN dan gandakan persen untuk mendapatkan putaran parsing tambahan

call echo %%time%% - Backing up first part:

Lihat Bagaimana skrip parse Windows Command Interpreter (CMD.EXE)? untuk memahami mengapa ini berhasil. Fase 1 dan 6 relevan di sini. Tapi waspadalah - banyak bahan yang sangat padat yang akan membutuhkan waktu untuk dicerna.

3) Gunakan ekspansi yang tertunda

Ini adalah teknik yang saya lebih suka gunakan.

Ini jauh lebih cepat daripada hack CALL. Dibutuhkan SETLOCAL untuk mengaktifkan ekspansi yang tertunda, dan penggunaan ! dari pada % untuk memperluas variabel:

setlocal enableDelayedExpansion
> C:\log\%date:~3,2%-%date:~0,2%.log (
  echo !time! - Backing up first part
  ... some logic
  echo !time! - Backing up second part
  ... 
)
dbenham
sumber