2012-11-29 02:49:32 +0000 2012-11-29 02:49:32 +0000
21
21

Używając Date and Times w pliku wsadowym do stworzenia nazwy pliku

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

Chciałbym, aby plik wsadowy tworzył inną kopię zapasową dla każdego uruchomienia, więc mogę wykonać kopię zapasową.

Pożądana nazwa pliku to gnucash_shockwave-20121128210344. sql (Date format YYYYY-MM-DD-HH-MM-SS)

Wyszukałem kilka rzeczy, które mówiły try %DATE:~4% i %Date.Year%, ale dostałem błąd, który mówi The system cannot find the specified path.

Jeśli usunę próbę podstemplowania czasowego, skrypt działa dobrze, ale nadpisuje 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?

Odpowiedzi (6)

28
28
28
2012-11-29 18:00:07 +0000

Format daty i godziny zależy od tego, co zostało określone w aplecie Region i język Panelu sterowania.

Uruchom następujący plik wsadowy (który zakłada dd/mm/yyyy i hh:mm:ss) i modyfikuj ekstrakcję podłańcucha (używając znaków : i ~) zgodnie z wymaganiami, aby uzyskać odpowiednie części z obu łańcuchów daty i czasu:

@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 ekstrakcji podłańcucha, wpisz set /? w wierszu poleceń lub zobacz ta strona .

8
8
8
2015-03-05 20:56:02 +0000

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
3
3
2015-06-25 20:25:48 +0000

Z małymi zmianami dostałam 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)

2
2
2
2019-03-28 17:59:29 +0000

Przepraszam za opóźnienie…

Jedynym niezawodnym sposobem na uzyskanie odpowiedniej daty niezależnie od ustawień regionalnych jest rozwiązanie foxidrive @ https://stackoverflow.com/questions/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
1
1
2018-06-15 08:44:00 +0000

Myślę, że to poprawia @Nick Rogers trochę odpowiedzieć.

EX: z niemieckim locate (de_DE) jest wiodącym białym miejscu w godzinach poniżej 10.

również chciałem wiodącego zera w godzinach. “echo - !\”! -“ daje "09” zamiast tylko “9”

więc łamię kod w dwóch kawałkach dla lepszego odczytu. ten przykład powinien pasować do większej liczby lokalizacji.

+bonus: _ms = milisekundy lub cokolwiek to są ostatnie dwie cyfry (-;

uwaga: czasami trzeba uciekać z HOUR, zobacz 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

wyjścia: echo fullTime = 15062018-10182821

0
0
0
2018-03-02 11:24:58 +0000

najkrótsza (najbardziej uniwersalna?) odpowiedź jest zgodna z następującym skryptem TimeStamp.cmd zawierającym tylko trzy linie kodu (z wyłączeniem 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"