バッチファイルで日付と時刻を使用してファイル名を作成する


20

バッチファイルからプログラムを実行しています。バッチファイルが完了すると、MySQLデータベースの自動バックアップが実行されます。

バッチファイルで実行ごとに異なるバックアップを作成して、バックトレースできるようにします。

目的のファイル名はgnucash_shockwave-20121128210344.sql(日付形式YYYY-MM-DD-HH-MM-SS)です

try %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!

助言がありますか?


アカウントを再度関連付けました。ログインして、自分の投稿と質問への回答にコメントできるようになりました。
-slhck

slhck、lolありがとう、何が起こっているのかと思っていたのですが、スタックオーバーフローではなかったことを思い出しましたlol
guyfromfl

%date%を%date:
〜6,4

回答:


28

日付と時刻の形式は、で指定したものによって異なります 地域と言語のコントロールパネルアプレットでます。

次のバッチファイル(dd / mm / yyyyおよびhh:mm:ssを想定)を実行し、必要に応じて部分文字列抽出を変更し(:および〜文字を使用)、日付と時刻の両方の文字列から適切な部分を取得します。

@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 /?は、コマンドプロンプトで入力するか、このページを参照してください


おかげで、私はこれが今どのように機能しているか理解できたと思います。私はオフィスにいませんが、私がそこに着いてポストバックしたらすぐにそれを試みます。私たちはWindows 8を使用しています。ご協力ありがとうございます
-guyfromfl

わかった、おそらく私の場所と言語のために、日付の文字列の場所を微調整する必要がありましたが、それはトリックをしました!どうもありがとうございました!
-guyfromfl

ロケールに依存しない日付の使用を取得するには、WMICの代わりに
phuclv

このソリューションは、マシンごとに異なる結果を提供できます。
メンディデガニ

私は日付の出力を変更し、何かを考えて、私が手> echo yyyy = %DATE:~6,4%生成しますyyyy = /20/。ただしecho yyyy = %DATE:~10,4%ですyyyy = 2019
teeks99

7

これが私のために働いたものです。

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
スーパーユーザーへようこそ!回答を編集して、コマンドの機能に関する説明を追加してください。
Excellll

あなたは間違った質問に答えています。OPの質問はYYYYMMDDを要求します。この答えはMMDDYYYYを与えます。
スコット

質問をしてStackに来て、そこに座って私のために一日を節約するのを待っている完璧な答えを持っているようなものはありません。@abbsとExcelllに感謝します。
時計回りに

3

少し調整してこれを手に入れました

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


これは他の回答とどう違うのですか?
容疑者

@suspectus:abbsの答えからこの回答が異なることabbsのは、米国の地域(すなわち、ロケール)、想定している中で%DATE%Ddd MM/DD/YYYY、これに対し、どこ非米国地域を想定して%DATE%DD/MM/YYYY(曜日なしに)。そして、これは間違っているという点でカランの答えとは異なります。質問はYYYYMMDDを要求します。この答えはDD_MM–YYYYを与えます。
スコット

2

遅れてごめんなさい...

地域設定が何であれ適切な日付を取得する唯一の信頼できる方法は、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

@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

出力:echo fullTime = 15062018-10182821


0

最短の(最も汎用性の高い)答えは、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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.