Dosya adı oluşturmak için toplu iş dosyasında Tarih ve Saatleri kullanma


20

Tamamlandığında MySQL veritabanımın otomatik yedeklemesini gerçekleştiren bir toplu iş dosyasından bir program çalıştırıyorum.

Toplu iş dosyasının her çalışma için farklı bir yedekleme oluşturmasını istiyorum, böylece geri izleyebilirim.

İstenen dosya adı gnucash_shockwave-20121128210344.sql (Tarih biçimi YYYY-AA-GG-YG-AA-SS)

Denedi diyen birkaç şeyi aradım %DATE:~4%ve %Date.Year%şöyle bir hata alıyorumThe system cannot find the specified path.

Zaman damgası girişimi kaldırırsam, komut dosyası iyi çalışır, ancak bir önceki yedeklemeyi yazar

İşte bahsettiğim kod bölümü:

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

Herhangi bir öneri?


Hesaplarınızı yeniden ilişkilendirdim, şimdi giriş yapıp kendi yayınlarınıza ve sorularınızın yanıtlarına yorum yapabilmelisiniz.
slhck

slhck, lol teşekkürler ben neler olduğunu merak ediyordum sonra ben yığın taşma lol değildi hatırladı
guyfromfl

% tarih% 'i% tarihe göre değiştirme: ~ 6,4% -% tarih: ~ 3,2% -% tarih: ~ 0,2% çalıştı
MagTun

Yanıtlar:


27

Tarih ve Saat biçimi, Bölge ve Dil Kontrol Paneli uygulamasında belirttiğiniz şeye bağlıdır .

Aşağıdaki toplu iş dosyasını ( gg / aa / yyyy ve ss: dd: ss olduğu varsayılır ) çalıştırın ve hem Tarih hem de Saat dizelerinden doğru parçaları almak için alt dize çıkarmayı (: ve ~ karakterlerini kullanarak) değiştirin:

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

Alt dize çıkarma hakkında daha fazla yardım set /?için komut istemine yazın veya bu sayfaya bakın .


Teşekkürler, bunun nasıl çalıştığını anladığımı düşünüyorum. Ofiste değilim, ama oraya varır ulaşmaz geri göndereceğim. Windows 8 kullanıyoruz Yardım için teşekkürler
guyfromfl

Anladım, muhtemelen benim konumum ve dil nedeniyle, tarihin dize konumlarını değiştirmek zorunda kaldı ama bu hile yaptı! Çok teşekkür ederim!
guyfromfl

Yerel ayardan bağımsız bir tarih elde etmek için wmic kullanın
phuclv

Bu çözüm size farklı makinelerde farklı sonuçlar verebilir.
Mehdi Dehghani

1
Tarih çıktısıyla bir şeylerin değiştiğini düşünüyorum, > echo yyyy = %DATE:~6,4%üretiyorum yyyy = /20/. Ancak echo yyyy = %DATE:~10,4%olduğunu yyyy = 2019.
teeks99

7

İşte benim için işe yarayan.

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

3
Süper Kullanıcıya Hoş Geldiniz! Yanıtlarınızı, komutlarınızın ne yaptığına ilişkin bazı açıklamalar içerecek şekilde düzenleyebilir misiniz?
Excellll

Yanlış soruyu cevaplıyorsunuz. OP'nin sorusu YYYYAAGG'yi soruyor; bu cevap MMDDYYYY'yi verir.
Scott

Stack'e bir soru ile gelmek ve sadece orada oturmak için mükemmel bir cevaba sahip olmak benim için günü kurtarmak için bekleyen gibi bir şey yok. @Abbs ve Excelll'e çok teşekkürler
clockwiseq

3

Küçük bir değişiklikle bunu anladım

@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


Sonuç:

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


Bunun diğer cevaplardan farkı nedir?
suspectus

@suspectus: Bu cevap, abbs'in bir ABD Bölgesi (yani yerel) olduğu varsayımındaki cevaptan farklıdır; burada %DATE%~ Ddd MM/DD/YYYY, ABD dışında bir bölge varsayar; burada %DATE%~ DD/MM/YYYY(haftanın günü olmadan). Ve bu, bunun yanlış olduğu için Karan'ın cevabından farklıdır - soru YYYYMMDD'yi soruyor; bu cevap DD_MM – YYYY verir.
Scott

2

Gecikme için özür dilerim ...

Bölgesel ayar ne olursa olsun uygun tarihi almanın tek güvenilir yolu foxidrive @ /programming/11037831/filename-timestamp-in-windows-cmd-batch-script çözümü

@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

1

Bu @Nick Rogers biraz cevap geliştirir düşünüyorum.

EX: german locate (de_DE) ile 10 saatin altındaki saatlerde önde gelen bir boşluk var.

Ayrıca ben saat önde gelen sıfır istedim. "echo -! ^ _ hh! -" yalnızca "9" yerine "09" değerini verir

Bu yüzden daha iyi okumak için iki parça halinde kodu kırıyorum. bu örnek daha fazla yerel ayarla eşleşmelidir.

+ bonus: _ms = milisaniye veya son iki basamak her ne ise (-;

açıklama: bazen HOUR kaçmak gerekir, iç kodu bakınız

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

çıkışlar: echo fullTime = 15062018-10182821


0

en kısa (en çok yönlü?) cevap, yalnızca üç satır kod içeren (yorumlar vb. hariç) aşağıdaki TimeStamp.cmd komut dosyasına göre ...

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

Bir toplu iş dosyasındaki FOR ifadesinde değişken için% yerine %% kullanılması gerektiğini unutmayın

... uygulama getirileri (boş satırlar ve yorumlar kaldırıldı) ...

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