バッチファイルからプログラムを実行しています。バッチファイルは、実行されるとMySQLデータベースの自動バックアップを実行します。
実行ごとにバッチファイルで異なるバックアップを作成したいので、バックトレースすることができます。
必要なファイル名はgnucash_shockwave-20121128210344.sql(日付形式YYYY-MM-DD-HH-MM-SS)です。
%DATE:~4%
と%Date.Year%
を試してみましたが、The system cannot find the specified path.
というエラーが表示されます。
私がそれをタイムスタンプする試みを取除く場合、スクリプトはうまく働きますが、以前のバックアップを上書きします
これが私が話しているコードのセクションです:
@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!
助言がありますか?
日付と時刻の形式は、地域と言語コントロールパネルアプレットで指定した内容によって異なります。
次のバッチファイル(dd/mm/yyyyおよびhh:mm:ssを想定しています)を実行し、部分文字列抽出を変更します(:およびを使用)。 Date文字列とTime文字列の両方から適切な部分を取得するために必要な、〜文字)
@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%
部分文字列抽出の詳細については、コマンドプロンプトでset /?
を入力するか、 このページ を参照してください。
これは私のために働いたものです。
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
ちょっとした調整でこれが得られ
@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
結果:
"test-do_25_06-2015-22_21_51.txt" (Thursday_25th_June_2015-22:21.51)
遅れてすみません...
どの地域設定であっても適切な日付を取得する唯一の信頼できる方法は、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
@Nick Rogersの回答が少し改善されたと思います。
例:ドイツ語位置指定(de_DE)の場合、10時を過ぎると先頭に空白が入ります。
また、私はその時間に先行ゼロが欲しかった。 "echo - !^ _ hh! - "は "9"だけではなく "09"になります。
だから私は読みやすくするためにコードを2つの部分に分けています。この例はより多くのロケールにマッチするはずです。
+ボーナス:_ms =ミリ秒または最後の2桁が何であれ( - ;
備考:時にはHOURをエスケープする必要があります。コード内を参照
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
出力:エコーfullTime = 15062018-10182821
最短の(最も用途の広い?)答えは、わずか3行のコード(コメントなどを除く)を含む次のTimeStamp.cmdスクリプトのとおりです。
@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%"
バッチファイルのFORステートメントでは、変数に%ではなく%%を使用する必要があることに注意してください。
...実行結果(空白行とコメントが削除された)...
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"