Użycie opcji Data i godzina w pliku wsadowym do utworzenia nazwy pliku

20

Uruchamiam program z pliku wsadowego, który po zakończeniu wykonuje automatyczną kopię zapasową mojej bazy danych MySQL.

Chciałbym, aby plik wsadowy tworzył inną kopię zapasową dla każdego uruchomienia, dzięki czemu mogę śledzić.

Pożądana nazwa pliku to gnucash_shockwave-20121128210344.sql (Format daty RRRR-MM-DD-HH-MM-SS)

Mam googled kilka rzeczy, w których stwierdzono, spróbuj %DATE:~4%a %Date.Year%jednak pojawia się błąd, który mówiThe system cannot find the specified path.

Jeśli usunę próbę znacznika czasowego, skrypt będzie działał poprawnie, ale wcześniej zapisuje poprzednią kopię zapasową

Oto sekcja kodu, o której mówię:

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

Jakieś sugestie?

guyfromfl
źródło
Ponownie powiązałem twoje konta, powinieneś być w stanie zalogować się i komentować własne posty oraz odpowiedzi na pytania.
slhck
slhck, lol dzięki Zastanawiałem się, co się dzieje, a potem przypomniałem sobie, że nie jestem w stanie przepełnienia stosu lol
guyfromfl
zamieniając% date% na% date: ~ 6,4% -% data: ~ 3,2% -% data: ~ 0,2% przepracowane
MagTun

Odpowiedzi:

27

Format daty i godziny zależy od ustawień określonych w aplecie Region and Language Control Panel.

Uruchom następujący plik wsadowy (który zakłada dd / mm / rrrr i gg: mm: ss ) i zmodyfikuj ekstrakcję podciągów (używając znaków: i ~) zgodnie z wymaganiami, aby uzyskać odpowiednie części z ciągów daty i godziny:

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

Aby uzyskać więcej pomocy na temat wyciągania podciągów, wpisz set /?w wierszu polecenia lub odwiedź tę stronę .

Karan
źródło
Dzięki, myślę, że rozumiem, jak to teraz działa. Nie ma mnie w biurze, ale spróbuję tego, jak tylko tam dotrę i wyślę z powrotem. Korzystamy z systemu Windows 8 Dzięki za pomoc
guyfromfl
Rozumiem, musiałem poprawić ciąg znaków daty, prawdopodobnie z powodu mojej lokalizacji i języka, ale to załatwiło sprawę! Dziękuję Ci bardzo!
guyfromfl
Aby uzyskać datę niezależną od ustawień regionalnych, użyj wmic zamiast
phuclv
To rozwiązanie może dać różne wyniki na różnych maszynach.
Mehdi Dehghani
1
Wydaje mi się, że coś się zmieniło wraz z wyjściem daty, co mogę > echo yyyy = %DATE:~6,4%wyprodukować yyyy = /20/. Jednak echo yyyy = %DATE:~10,4%jest yyyy = 2019.
teeks99,
7

Oto, co dla mnie zadziałało.

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
abbs
źródło
3
Witamy w Super User! Czy możesz zredagować swoją odpowiedź, aby zawierała wyjaśnienie tego, co robią twoje polecenia?
Excellll,
Odpowiadasz na złe pytanie. Pytanie OP dotyczy RRRRMMDD; ta odpowiedź daje MMDDRRRR.
Scott
nie ma to jak przyjść do Stack z pytaniem i mieć idealną odpowiedź, po prostu siedząc i czekając, aby ocalić mi dzień. Dziękuję bardzo @abbs i Excelll
zgodnie z ruchem wskazówek zegara
3

Z drobnymi poprawkami mam to

@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


Wynik:

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

André Verwijs
źródło
Czym różni się to od innych odpowiedzi?
podejrzenie
@suspectus: Ta odpowiedź różni się od odpowiedzi abb tym, że abbs zakłada region USA (tj. locale), gdzie %DATE%~ Ddd MM/DD/YYYY, podczas gdy ten zakłada region poza USA, gdzie %DATE%~ DD/MM/YYYY(bez dnia tygodnia). A ta różni się od odpowiedzi Karana tym, że jest błędna - pytanie dotyczy RRRRMMDD; ta odpowiedź daje DD_MM – RRRR.
Scott
2

Przepraszam za opóźnienie ...

Jedynym niezawodnym sposobem uzyskania odpowiedniej daty niezależnie od ustawienia regionalnego jest rozwiązanie 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
źródło
1

myślę, że to trochę poprawia odpowiedź @Nick Rogers.

EX: z niemieckim lokalizatorem (de_DE) wiodąca biała spacja w godzinach poniżej 10.

chciałem też mieć zero na początku. „echo -! ^ _ hh! -” daje „09” zamiast tylko „9”

więc podzielę kod na dwie części, aby lepiej czytać. ten przykład powinien pasować do większej liczby lokalizacji.

+ bonus: _ms = milisekundy lub cokolwiek z ostatnich dwóch cyfr (-;

uwaga: czasami GODZINA musi być uciekana, patrz kod wewnętrzny

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

dane wyjściowe: echo fullTime = 15062018-10182821

le luxe fou
źródło
0

najkrótsza (najbardziej uniwersalna?) odpowiedź jest zgodna z następującym skryptem TimeStamp.cmd zawierającym tylko trzy wiersze kodu (bez komentarzy itp.) ...

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

Zwróć uwagę na potrzebę użycia %% zamiast% dla zmiennej w instrukcji FOR w pliku wsadowym

... wydajność wykonania (usunięte puste linie i komentarze) ...

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
źródło