% Time% değişkenini kullanan toplu komut dosyası için sıfırın başında olması gerekiyor


26

DOS komut dosyamda, dosya adlandırma için tarih ve saat verilerini kullanan bir hatayla karşılaştım. Sorun bir zaman aşımına uğradım çünkü zaman değişkeni otomatik olarak <10 saat boyunca sıfır öncüsü sağlamıyordu.

Bunu düzeltmek için önde gelen sıfırları koşullu olarak doldurmanın bir yolunu bilen var mı?

Daha fazla bilgi: Dosya adımı ayar komutu:

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

ki sonuç şu: C: \ Temp \ robolog_20100602_ 93208.log (sabah 9:23 için).

Bu soru ile ilgilidir bu bir .

Teşekkürler


Dolgulu çalışma saati değeri almak mümkündür ... FOR / F "TOKENS = 1 DELIMS =:" %% A IN ('TIME / T') YAPIN HH = %% A sonra% zaman değiştirin: ~% 0,2 % HH% ile daha kompakt bir çözüm umuyordum, ancak bu işe yarayacak.
Ira

"Kompakt" bir çözüm başka bir dilde olabilir (powershell? Python? Perl? WSH?).
Grawity

Kullandığım çözüm olarak Jesse'nin cevabını işaretlemek için değişti. Öğle vakti önyükleme süresi 0 ile öne çıkması ve öğlen sonrası askeri zaman ile çalışır.
Ira

Yanıtlar:


60

Çok basit bir yol, baştaki boşluğu sıfır ile değiştirmektir:
echo %TIME: =0%
çıktılar:
09:18:53,45


1
işe yarıyor! Bu sanırım en basit çözüm ..
aerobrain 2

Bu aynı zamanda birden fazla karakterle yapılabilir mi? hepsi ',', '' ve ':'. Şu anda orta değişkenler oluşturuyorum ama elbette, bu sadece birkaç değişiklikten dolayı işe yarıyor. Daha fazlası için hantal olurdu.
Devolus

1
Ben Saat değiştirmek için ikinci bir "adım" Bu kullanıyorum: set HH=%time:~-11,2% set MM=%time:~-8,2% set SS=%time:~-5,2% set ISOTIME=%HH: =0%-%MM%-%SS% echo %ISOTIME%Ayrıca bakınız ss64.com/nt/syntax-replace.html
kolu

+1 Bu en kısa / en iyi cevap. Nasıl kullandım: set timestring=%TIME: =0%alt çağrının başlarında - sonra bununla çalışın timestring(ya da ne tür bir değişken kullanıyorsanız).
bshea

14

Benim çözümüm şu fikri kullanmaktı:

SET HOUR=%TIME:~0,2%
IF "%HOUR:~0,1%" == " " SET HOUR=0%HOUR:~1,1%

Bunu sevdim. Basit ve sezgisel.
Ken

Modern pencerelerde çalışır, ancak sunucuda 2003 sözdizimi hatası verir!
Dr. BDO Adams

2008+ ve en zarif çözümde kusursuz çalışır. Teşekkür ederim.
bjoster

1
but gives syntax error on server 2003- neden 2016'da bunu umursuyorsun?
Marcin Orlowski

Windows 10 için Mükemmel Komut İstemi
Mike Upjohn

5

Dennis'in cevabına benzer bir fikir . Sorun şu ki genişliği %time%her zaman aynıdır, bu nedenle daha kısa bir dize döndürmek yerine başlangıçta bir boşluk ekler.

Bundan kurtulabilirsin for:

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

Öyleyse gerisi az çok aynı.


2
Bu çözüm> 10 için çalışıyor ancak şimdi 10 için '010' yaratıyor: ...
Devolus

3
Jesse'nin cevabı doğru olanı ...
Simon Sobisch

Bu çok kötü bir cevap, saatte iki rakam olduğu anda bozuluyor. OP'nin seçilmesine inanamıyorum.
thebunnyrules 14:15

3

Jesse'nin Katkısını kullanarak, yalnızca değiştirilen çıktıyla bir değişken oluşturdum. Sonra saat kısmını oluşturmak için bu değişkene başvururum.

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

Orijinal kaynakla:

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

Sağol Jesse. İtibar puanlarım olsaydı, oy kullanırdım.


1

Yukarıdaki her şeyi uygulayan en kompakt çözüm için, bence

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

betiğe yeni satırlar eklemeden burada çalışacaktı. Belki de çoklu komut çözümlerinden daha az zarif.


1

Aşağıdaki birkaç satır daha sürer ancak açık ve anlaşılırdır. Her biri bir zaman damgası olan dosyaları ayırmak için stdout ve stderr komutunu kaydeder. Zaman damgası, bu siparişte yıl, ay, gün, saat, dakika ve saniyeyi içerir. Zaman damgaları her zaman önce en önemli tarih bileşenine (yıl) ve en düşük bileşen değerine (saniye) sahip olmalıdır. Bu, dosya listelerinin zamana göre olmasını sağlar. Daha fazla uzatmadan, işte benim çözüm.

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

0

Bu, zamanın başlangıcında sıfıra düşer ve saatin son iki hanesini alır (dakika ve ikinci başlangıç ​​konumları birer birer kaydırılır). Öyleyse 3 AM, "03", sonra "03" ve 15 saati, "015", sonra "15" olur.

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

Daha az okunaklı:

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

1
Bunun işe yarayacağından emin değilim. 'T =% 0 zaman%' ayarını yaparsam ve saat 9:38 AM ise, eko% T% geri verir: '0 9: 38: 54.21', sonra% T: ~ 1,2% alan alır 0.
Ira,

0

Bir kod satırı ihtiyacınız olanı yapacak:

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

Örneğin,% Date% kullanıyorum ve sonra% 1% için satır aralığını sıfırla değiştirmem gerekip gerekmediğini belirlemek için kullandığım değişkene bir satır sıfır ekleyin.

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

0

Bu, sıralanabilir bir zaman damgası oluşturur ve ikinci satır, komut satırlarında kullanılabilir olması için tek basamaklı saat, vb. İçin boşluk kalmamasını sağlar:

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

Çıktı:

2018.02.26__9.47.34


0

Yukarıdan gelen yardım için teşekkürler.

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

Daha sonra şöyle Robocopy işlerde çağrılan günlükleri var:

Bunun gibi pek çok şey var:

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

Bununla iş bitiriyor:

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

COMPLETE_LOG_2018-06-27_10_53_54.log sonunda üretilen dosyadır ve dosya adına göre sıralanabilir.


0

Jesse'nin cevabı, saat alanındaki boşluğu ortadan kaldırarak dosya yeniden adlandırma sorunumu çözdü. Değişkenlerimi şöyle ayarladım:

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

Bir şampiyon gibi çalışır; nedense tarih aynı tedaviye ihtiyaç duymuyordu, ama bunun bölgesel düzenlemelere bağlı olduğunu düşünüyorum.


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

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

5
Her ne kadar kod takdir edilse de, her zaman eşlik eden bir açıklaması olmalıdır. Bu uzun sürmek zorunda değil ama bekleniyor.
peterh, Monica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.