ファイルを出力するバッチスクリプトがあり、スクリプトが実行されるたびに既存のファイルが上書きされないようにしようとしています。そのため、タイムスタンプを付けようとしています。
現在、私はこれを持っています:
set stamp=%DATE:/=-%_%TIME::=-%
しかし、時間が午前1時から9時の場合、次のようになります。
13-06-2012_ instead of a full 13-06-2012_12-39-37.28
どうすれば修正できますか?
Windows 7を使用していますが、コマンドラインウィンドウでのecho %date% %time%
の出力は次のとおりです(「短い日付」の時計形式は3文字の月を表示するように設定されています)。
03-Sep-12 9:06:21.54
編集:しばらくの間、次のタイムスタンプを使用してきましたが、うまくいきます。
set timestamp=%DATE:/=-%_%TIME::=-%
set timestamp=%timestamp: =%
18-03-2013_13-37-43.26
と/
の:
と%TIME%
を置き換えて、空白を削除することにより、%DATE%
のようなタイムスタンプを生成しました。私の元々の質問では、空白が本当に問題でした。
Stack Overflow quesionへの回答)のおかげで、バッチジョブでファイル名をタイムスタンプとして作成する 、ファイル名を終了するスペース。
このコードの最初の4行は、WMICを使用してXP Pro以上で信頼できるYY DD MM YYYY HH Min Sec変数を提供します。
@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
Stack Overflowの質問Windowsコマンドラインで現在の日時をファイル名で使用するのに適した形式で取得する方法?を参照してください。
ファイル_date.bat
_を作成します。
_@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-3 delims=/:/ " %%a in ('time /t') do (set mytime=%%a-%%b-%%c)
set mytime=%mytime: =%
echo %mydate%_%mytime%
_
_date.bat
_を実行します。
_C:\>date.bat
2012-06-14_12-47-PM
_
更新:
次のように1行でも実行できます。
for /f "tokens=2-8 delims=.:/ " %%a in ("%date% %time%") do set DateNtime=%%c-%%a-%%b_%%d-%%e-%%f.%%g
タイムスタンプを返すために作成したバッチスクリプトを次に示します。オプションの最初の引数を指定して、フィールドの区切り文字として使用できます。例えば:
c:\ sys\tmp> timestamp.bat
20160404_144741
c:\ sys\tmp> timestamp.bat-
2016-04-04_14-45-25
c:\ sys\tmp> timestamp.bat:
2016:04:04_14:45:29
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
:: put your desired field delimiter here.
:: for example, setting DELIMITER to a hyphen will separate fields like so:
:: yyyy-MM-dd_hh-mm-ss
::
:: setting DELIMITER to nothing will output like so:
:: yyyyMMdd_hhmmss
::
SET DELIMITER=%1
SET DATESTRING=%date:~-4,4%%DELIMITER%%date:~-7,2%%DELIMITER%%date:~-10,2%
SET TIMESTRING=%TIME%
::TRIM OFF the LAST 3 characters of TIMESTRING, which is the decimal point and hundredths of a second
set TIMESTRING=%TIMESTRING:~0,-3%
:: Replace colons from TIMESTRING with DELIMITER
SET TIMESTRING=%TIMESTRING::=!DELIMITER!%
:: if there is a preceeding space substitute with a zero
echo %DATESTRING%_%TIMESTRING: =0%
2018-02-08_14.32.06.34.log形式のWindowsバッチログファイル名:
setlocal
set d=%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%
set t=%time::=.%
set t=%t: =%
set logfile="%d%_%t%.log"
ping localhost -n 11>%1/%logfile%
endlocal
過去に、インターネットで見つけた.cmdスクリプトを使用しました。ローカリゼーションが通常、日付を台無しにする方法が嫌いです。ファイル名に日付がある場合(または太字の場合はどこでも)、ISO 8601形式で日付が必要だと思います。
2015-02-19T14:54:51Z
または次のようなY M D H Mがこの順序である何か
2015-02-19 14:54
mDY/DMYのあいまいさを修正し、テキストとしてソートできるためです。
私はその.cmdスクリプトをどこで手に入れたかわかりませんが、 http://ss64.com/nt/syntax-getdate.html であった可能性があります。これは私のYYYY-MM- DD Windows 8.1およびWindows 7のM/D/YYYY Vanillaインストール上。どちらも同じ形式を提供します。
2015-02-09 04:43
DD-MM-YYYY_HH-MM-SS.TT
ここでTTはティックです。例外はすべてを示しています。
for /f "tokens=2-8 delims=.:/ " %%a in ("%date% %time: =0%") do set DateNtime=%%c-%%a-%%b_%%d-%%e-%%f.%%g
echo %DateNtime%
または、コマンドラインから:
for /f "tokens=2-8 delims=.:/ " %a in ("%date% %time: =0%") do echo %c-%a-%b_%d-%e-%f.%g
編集:ブライスによる非標準時間/日付の仕様。 (03-Sep-12 9:06:21.54
)
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-7 delims=.:/- " %%a in ("%date% %time%") do (
if "%%b"=="Jan" set MM=01
if "%%b"=="Feb" set MM=02
if "%%b"=="Mar" set MM=03
if "%%b"=="Apr" set MM=04
if "%%b"=="May" set MM=05
if "%%b"=="Jun" set MM=06
if "%%b"=="Jul" set MM=07
if "%%b"=="Aug" set MM=08
if "%%b"=="Sep" set MM=09
if "%%b"=="Oct" set MM=10
if "%%b"=="Nov" set MM=11
if "%%b"=="Dec" set MM=12
set HH=0%%d
set HH=!HH:~-2!
echo 20%%c-!MM!-%%a_!HH!-%%e-%%f.%%g
)
endlocal