Perlu memimpin nol untuk skrip batch menggunakan% time% variabel

26

Saya menemukan bug dalam skrip DOS saya yang menggunakan data tanggal dan waktu untuk penamaan file. Masalahnya adalah saya berakhir dengan celah karena variabel waktu tidak secara otomatis memberikan nol di depan untuk jam <10. Jadi menjalankan> echo% time% memberikan kembali: '9: 29: 17.88'.

Apakah ada yang tahu cara mengkondisikan nol di depan untuk memperbaiki ini?

Info lebih lanjut: Perintah kumpulan nama file saya adalah:

set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log

yang akhirnya menjadi: C: \ Temp \ robolog_20100602_ 93208.log (untuk 9:23 pagi).

Pertanyaan ini terkait dengan yang ini .

Terima kasih

Ira
sumber
Dimungkinkan untuk mendapatkan nilai jam empuk ... UNTUK / F "TOKENS = 1 DELIMS =:" %% A IN ('TIME / T') LAKUKAN SET HH = %% A lalu ganti% waktu: ~ 0,2% dengan% HH% Saya berharap untuk solusi yang lebih ringkas, tetapi ini akan berhasil.
Ira
Solusi "lebih ringkas" akan berupa sesuatu dalam bahasa lain (powershell? Python? Perl? WSH?).
grawity
Beralih untuk menandai jawaban Jesse sebagai solusi yang saya gunakan. Ini bekerja dengan kedua waktu pra-siang hari untuk memimpin dengan memimpin 0 dan juga waktu militer pasca-siang.
Ira

Jawaban:

60

Cara yang sangat sederhana adalah dengan hanya mengganti ruang terdepan dengan nol:
echo %TIME: =0%
keluaran:
09:18:53,45

Jesse
sumber
1
berhasil! ini adalah solusi paling sederhana yang saya kira ..
aerobrain
Bisakah ini dilakukan dengan banyak karakter? iE all ',', '' and ':'. Saat ini saya membuat variabel perantara tetapi tentu saja, ini hanya berhasil karena beberapa jumlah penggantian. Lebih dari itu akan merepotkan.
Devolus
1
Saya menggunakan ini dalam "langkah" kedua untuk memodifikasi Jam: Lihat set HH=%time:~-11,2% set MM=%time:~-8,2% set SS=%time:~-5,2% set ISOTIME=%HH: =0%-%MM%-%SS% echo %ISOTIME%juga ss64.com/nt/syntax-replace.html
handle
+1 Ini adalah jawaban terpendek / terbaik. Bagaimana saya menggunakan: set timestring=%TIME: =0%di awal panggilan sub - kemudian hanya bekerja dengan timestringgantinya (atau variabel apa pun yang Anda gunakan).
bshea
14

Solusi saya adalah menggunakan ide berikut:

SET HOUR=%TIME:~0,2%
IF "%HOUR:~0,1%" == " " SET HOUR=0%HOUR:~1,1%
Neil Ratcliffe
sumber
Saya suka itu. Sederhana dan intuitif.
Ken
Bekerja di windows modern, tetapi memberikan kesalahan sintaks pada server 2003!
Dr BDO Adams
Berfungsi sempurna pada 2008+, solusi paling elegan. Terima kasih.
bjoster
1
but gives syntax error on server 2003- mengapa Anda peduli pada tahun 2016?
Marcin Orlowski
Sempurna di Command Prompt Windows 10
Mike Upjohn
5

Ide yang mirip dengan jawaban Dennis . Masalahnya adalah bahwa lebar%time% selalu sama, sehingga menyisipkan spasi di awal alih-alih mengembalikan string yang lebih pendek.

Anda dapat menghilangkannya dengan for:

for /f "delims= " %x in ("%time%") do set T=0%x

Sisanya kurang lebih sama.

Joey
sumber
2
Solusi ini berfungsi untuk> 10 tetapi sekarang menciptakan '010' untuk 10: ...
Devolus
3
Jawaban dari Jesse adalah yang benar ...
Simon Sobisch
Ini adalah jawaban yang sangat buruk, itu rusak segera setelah ada dua digit dalam satu jam. Saya tidak bisa percaya OP memilihnya.
thebunnyrules
3

Menggunakan Kontribusi Jesse, saya baru saja membuat variabel dengan output yang dimodifikasi. Lalu saya referensi variabel itu untuk membangun porsi jam.

set NantTime=%time: =0%
nant\bin\nant.exe -nologo+ -debug+ -verbose+ -D:project.config=debug /f:build\default.build -l:logs\architect-build-%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%-%NantTime:~0,2%-%time:~3,2%-%time:~6,2%.log 
pause

Dengan sumber asli:

set hour=%time: =0%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%hour:~0,2%%time:~3,2%%time:~6,2%.log

Terima kasih Jesse. Saya akan memilih jika saya memiliki poin reputasi.

Ben Newcomb
sumber
1

Untuk solusi paling ringkas mengimplementasikan semua hal di atas, saya pikir itu

UNTUK / F "TOKENS = 1-4 DELIMS = /" %% A IN ("% DATE%") LAKUKAN UNTUK / F "TOKENS = 1-3 DELIMS = :." %% E IN ("% TIME: = 0%") LAKUKAN SET logfile = C: \ Temp \ robolog _ %% D %% C %% B%% E%% F%% G.log

akan bekerja di sini tanpa menambahkan baris baru ke skrip. Ini mungkin kurang elegan daripada beberapa solusi perintah, meskipun ..

Jerry
sumber
1

Berikut ini mengambil beberapa baris lagi tetapi jelas dan dapat dimengerti. Menghemat stdout dan stderr untuk memisahkan file, masing-masing dengan stempel waktu. Stempel waktu mencakup tahun, bulan, hari, jam, menit, dan kedua, dalam urutan itu. Stempel waktu harus selalu memiliki komponen tanggal paling penting terlebih dahulu (tahun) dan komponen paling sedikit (detik) terakhir. Itu memungkinkan daftar file dalam urutan waktu. Tanpa basa-basi lagi, inilah solusi saya.

:prepare time stamp 
set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set hour=%time:~0,2%
:replace leading space with 0 for hours < 10
if "%hour:~0,1%" == " "  set hour=0%hour:~1,1%
set minute=%time:~3,2%
set second=%time:~6,2%
set timeStamp=%year%.%month%.%day%_%hour%.%minute%.%second%

:run the program 
ProgramName.pl 1> RunLogs\out.%timeStamp% ^
               2> RunLogs\err.%timeStamp%
David
sumber
0

Ini mengetuk nol ke awal waktu dan mengambil dua digit terakhir jam (posisi awal menit dan kedua digeser oleh satu). Jadi 3:00 menjadi "03" lalu "03" dan jam 15 menjadi "015" lalu "15".

set T=0%time%
set T=%T:~1,2%%T:~4,2%%T:~7,2%
set D=%date:~-4%%date:~4,2%%date:~7,2%
set logfile=C:\Temp\robolog_%D%_%T%.log

Kurang mudah dibaca:

set T=0%time%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%T:~1,2%%T:~4,2%%T:~7,2%.log
Dijeda sampai pemberitahuan lebih lanjut.
sumber
1
Saya tidak yakin ini berhasil. Jika saya menjalankan 'set T = 0% waktu%' dan ini jam 9:38 pagi, gema% T% memberikan kembali: '0 9: 38: 54.21', lalu mengambil% T: ~ 1,2% mendapatkan ruang, tidak ada pemimpin 0.
Ira
0

Satu baris kode akan melakukan apa yang Anda butuhkan:

    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%

Sebagai contoh, saya menggunakan% Date% dan kemudian menambahkan nol di depan ke variabel yang saya gunakan untuk menentukan apakah saya perlu mengganti spasi di depan dengan nol untuk% Time%.

    ::Prepare TimeStamp variable by replacing leading space with 0 for Hours < 10
    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    Echo Started on %Date$ at %TimeStamp%

    :: Insert what you are doing here...

    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    ECHO Finished on %Date% at %TimeStamp%
Richard Wright
sumber
0

Ini membuat timestamp yang dapat diurutkan dan baris kedua memastikan tidak ada ruang untuk satu digit jam, dll, untuk membuatnya dapat digunakan untuk skrip:

set datestamp=%date:~-4%.%date:~-10,-8%.%date:~-7,-5%_%time:~0,2%.%time:~3,2%.%time:~6,2%
set datestamp=%datestamp: =_%

Keluaran:

2018.02.26__9.47.34

Muposat
sumber
0

Terima kasih untuk membantu dari atas ... Ini yang saya gunakan:

C:\Windows\System32>SET short=%date:~10,4%-%date:~4,2%-%date:~7,2%
C:\Windows\System32>ECHO -- Short Date: %short%
-- Short Date: 2018-06-27
C:\Windows\System32>SET long=%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
C:\Windows\System32>ECHO -- Long Date: %long%
-- Long Date: 2018-06-27_10_51_43

Saya kemudian memiliki log yang dipanggil dalam pekerjaan Robocopy seperti ini:

Ada banyak yang seperti ini:

Robocopy C:\Users\ME\Favorites\ %usb%:\Local_PC\Favorites\ /MIR /TEE /FFT /DST /TIMFIX /W:5 /R:5 /NP /LOG+:%usb%:\Robocopy\LOG_%short%.txt

Mengakhiri pekerjaan dengan ini:

REN %usb%:\Robocopy\LOG_%short%.txt COMPLETE_LOG_%long%.log

COMPLETE_LOG_2018-06-27_10_53_54.log adalah file yang diproduksi di akhir dan disortir berdasarkan nama file.

Chip Delozier
sumber
0

Jawaban Jesse memecahkan masalah saya mengganti nama file dengan menghilangkan ruang di bidang jam. Ini adalah cara saya mengatur variabel saya:

for /f "tokens=1,2,3,4 delims=/ " %%a in ("%date%") do set wday=%%a&set month=%%b&set day=%%c&set year=%%d
for /f "tokens=1,2 delims=:" %%a in ("%time: =0%") do set hour=%%a&set minute=%%b

Ini bekerja seperti juara; untuk beberapa alasan tanggal tidak memerlukan perlakuan yang sama, tapi saya membayangkan itu tergantung pada pengaturan regional.

bradzilla3k
sumber
0
    @echo off



    call :PAD aaa,2,0,grw
    echo [[aaa=%aaa%]]
    pause




rem #### Function PAD ####
    goto :PADEND
    :PAD <var>,<length>,<padchar>,<string>
        set padtot=%~2
        set padchar=%~3
        set padString=%~4
        :StartPADLOOP
            call :len lenpadString,%padString%
            if ["%lenpadString%"] GEQ ["%padtot%"] goto :EndPADLOOP
            set padString=%padchar%%padString%
            goto :StartPADLOOP
        :EndPADLOOP
        set %~1=%padString%
    GOTO :EOF
    :PADEND


rem #### Function LEN ####
    goto :LENEND
    :LEN <var>,<string>
        set LENtempvar=%~2
        rem echo {{S:%LENtempvar%}}
        set LENCOUNT=0    
        :startLENLOOP
            if ["%LENtempvar%"] EQU [""] goto :endLENLOOP
            rem echo {{A:%LENtempvar%}}
            set LENtempvar=%LENtempvar:~0,-1%
            rem echo {{B:%LENtempvar%}}
            set /a LENCOUNT=LENCOUNT+1
        goto :startLENLOOP
        :endLENLOOP
        set %~1=%LENCOUNT%
    GOTO :EOF
    :LENEND
Risoos
sumber
-2
set sFolderName=%time: =0%
xcopy "%UserProfile%\Pictures\*.jpg" Y:\"%DATE%-%sFolderName:~0,2%h%time:~3,2%m%time:~6,2%s-%random%" /I /C /Y

15.06.2015-03h43m34s-5357

5357-%random%"
Vitokhv
sumber
5
Meskipun kode dihargai, itu harus selalu memiliki penjelasan yang menyertainya. Ini tidak harus lama tetapi diharapkan.
peterh mengatakan mengembalikan Monica