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?


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


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

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)


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

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


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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.