Windows コマンドラインで現在の日時をファイル名で使用するのに適した形式で取得するにはどうすればよいですか?
-
03-07-2019 - |
質問
アップデート:2016 年になったので、下位互換性に関する本当に説得力のある理由がない限り、特に PowerShell を使用する際の地域設定の問題があるため、これには PowerShell を使用するでしょう。 date
. 。@npocmaka を参照してください https://stackoverflow.com/a/19799236/8479
ファイル名に含めることができる形式で現在の日時を取得するために使用できる Windows コマンド ライン ステートメントは何ですか?
現在の日付と時刻を名前の一部として含むディレクトリをアーカイブに圧縮する .bat ファイルが必要です。たとえば、次のようになります。 Code_2008-10-14_2257.zip
. 。マシンの地域設定に関係なく、これを行う簡単な方法はありますか?
日付の形式は特に気にしません。理想的には yyyy-mm-dd ですが、単純なものであれば問題ありません。
これまでのところ、私はこれを持っています、私のマシンではそれが私に与えます Tue_10_14_2008_230050_91
:
rem Get the datetime in a format that can go in a filename.
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%
rem Now use the timestamp by in a new ZIP file name.
"d:\Program Files\7-Zip\7z.exe" a -r Code_%_my_datetime%.zip Code
これでも大丈夫ですが、少し不格好に思えます。理想的には、より簡潔で、前述した形式になるとよいでしょう。
Windows Server 2003 と Windows XP Professional を使用しています。これを実現するために追加のユーティリティをインストールしたくありません (ただし、日付の書式設定を適切に行うユーティリティがいくつかあることはわかっています)。
解決
Windowsバッチファイル(.bat)で現在の日付をMMDDYYYY形式で取得します :
@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime%
24時間/軍事形式の時刻を希望する場合は、2番目のFOR行を次のように置き換えることができます。
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
C:> 。\ date.bat
2008-10-14_0642
地域の日/月の順序とは無関係に日付が必要な場合は、「WMIC os GET LocalDateTime」を使用できます。 ISO順であるため、ソースとして:
@echo off
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%
echo Local date is [%ldt%]
C:> test.cmd
です
ローカル日付は[2012-06-19 10:23:47.048]
他のヒント
地域的に独立した日時の解析
%DATE%
および dir
コマンドの出力形式は地域に依存しているため、堅牢でもスマートでもありません。 date.exe ( UnxUtils )は、考えられる形式で日付と時刻の情報を配信します。 date.exe
を使用して、任意のファイルから日付/時刻情報を抽出することもできます。
例:(cmdスクリプトでは、%の代わりに%%を使用します)
date.exe +"%Y-%m-%d"
2009-12-22
date.exe +"%T"
18:55:03
date.exe +"%Y%m%d%H%M%S:任意のテキスト"
20091222 185503:テキスト
date.exe +" Text:%y /%m /%d-any text-%H.%M"
テキスト:09/12 / 22-any text-18.55
コマンド:date.exe +"%m-%d"""%H%M%S""""
07-22" 18:55:03" `
参照ファイルの日付/時刻情報:
date.exe -r c:\ file.txt +" file.txtのタイムスタンプ:%Y-%m-%d%H:%M:%S"
CMDスクリプトで使用して、年、月、日、時刻の情報を取得します:
for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n
CMDスクリプトで使用して、必要な形式のタイムスタンプを取得します。
for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe +"%%y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i
参照ファイルから日付/時刻情報を抽出します。
for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n
ファイルへの日付/時刻情報の追加:
for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y-%%m-%%d.%%H%%M%%S"') do ren file.txt file.%%i.txt
date.exeは無料のGNUツールの一部であり、インストールは不要です。 p>
注: date.exe
を検索パスにあるディレクトリにコピーすると、Windows組み込みの date
コマンドを使用する他のスクリプトが失敗する場合があります。
時間設定に依存しない2つの方法(両方とも:ローカライズから独立したデータ/時間を取得する方法:)。また、両方とも曜日を取得しますが、管理者権限は不要です:
-
MAKECAB -すべてのWindowsシステムで動作します(高速ですが、小さな一時ファイルを作成します)(foxidriveスクリプト):
@echo off pushd "%temp%" makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do ( set "current-date=%%e-%%b-%%c" set "current-time=%%d" set "weekday=%%a" ) del ~.* popd echo %weekday% %current-date% %current-time% pause
-
ROBOCOPY -Windows&nbsp; XPおよびWindows Server 2003のネイティブコマンドではありませんが、 Microsoftサイトからダウンロード。ただし、Windows&nbsp; Vista以降のすべてに組み込まれています:
@echo off setlocal for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do ( set "dow=%%D" set "month=%%E" set "day=%%F" set "HH=%%G" set "MM=%%H" set "SS=%%I" set "year=%%J" ) echo Day of the week: %dow% echo Day of the month : %day% echo Month : %month% echo hour : %HH% echo minutes : %MM% echo seconds : %SS% echo year : %year% endlocal
その他のWindowsスクリプト言語を使用する3つの方法。彼らはあなたにもっと柔軟性を与えます。年の週、ミリ秒単位の時間などを取得できます。
-
JScript / batch ハイブリッド(
.bat
として保存する必要があります)。 JScriptは、 Windowsスクリプトホスト(レジストリを通じて無効にすることはできますが、まれなケースです):@if (@X)==(@Y) @end /* ---Harmless hybrid line that begins a JScript comment @echo off cscript //E:JScript //nologo "%~f0" exit /b 0 *------------------------------------------------------------------------------*/ function GetCurrentDate() { // Today date time which will used to set as default date. var todayDate = new Date(); todayDate = todayDate.getFullYear() + "-" + ("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" + ("0" + todayDate.getDate()).slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" + ("0" + todayDate.getMinutes()).slice(-2); return todayDate; } WScript.Echo(GetCurrentDate());
-
VSCRIPT / BATCH ハイブリッド( 一時ファイルを使用せずにバッチファイル内にVBScriptを埋め込み、実行することは可能ですか? )JScriptと同じ場合、ハイブリダイゼーションはそれほど完璧ではありません:
:sub echo(str) :end sub echo off '>nul 2>&1|| copy /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul '& echo current date: '& cscript /nologo /E:vbscript "%~f0" '& exit /b '0 = vbGeneralDate - Default. Returns date: mm/dd/yy and time if specified: hh:mm:ss PM/AM. '1 = vbLongDate - Returns date: weekday, monthname, year '2 = vbShortDate - Returns date: mm/dd/yy '3 = vbLongTime - Returns time: hh:mm:ss PM/AM '4 = vbShortTime - Return time: hh:mm WScript.echo Replace(FormatDateTime(Date,1),", ","-")
-
PowerShell -.NETがインストールされているすべてのマシンにインストール可能-Microsoftからダウンロード( v1 、 v2 、 v3 (Windows&nbsp; 7のみ)以上))。 Windows&nbsp; 7 / Windows Server 2008以降のすべてにデフォルトでインストールされます:
C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
バッチファイルから使用するには:
for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
-
自己コンパイルされたjscript.net/batch (.NETのないWindowsマシンを見たことがないので、これはかなり移植性が高いと思います):
@if (@X)==(@Y) @end /****** silent line that start JScript comment ****** @echo off :::::::::::::::::::::::::::::::::::: ::: Compile the script :::: :::::::::::::::::::::::::::::::::::: setlocal if exist "%~n0.exe" goto :skip_compilation set "frm=%SystemRoot%\Microsoft.NET\Framework\" :: Searching the latest installed .NET framework for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do ( if exist "%%v\jsc.exe" ( rem :: the javascript.net compiler set "jsc=%%~dpsnfxv\jsc.exe" goto :break_loop ) ) echo jsc.exe not found && exit /b 0 :break_loop call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0" :::::::::::::::::::::::::::::::::::: ::: End of compilation :::: :::::::::::::::::::::::::::::::::::: :skip_compilation "%~n0.exe" exit /b 0 ****** End of JScript comment ******/ import System; import System.IO; var dt=DateTime.Now; Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
-
Logman これは、年と曜日を取得できません。比較的低速で、一時ファイルも作成され、logmanがログファイルに付けるタイムスタンプに基づいています。 Windows&nbsp; XP以降のすべてで動作します。私を含む誰にも使用されることはないでしょうが、もう1つの方法です...
@echo off setlocal del /q /f %temp%\timestampfile_* Logman.exe stop ts-CPU 1>nul 2>&1 Logman.exe delete ts-CPU 1>nul 2>&1 Logman.exe create counter ts-CPU -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ >nul Logman.exe start ts-CPU 1>nul 2>&1 Logman.exe stop ts-CPU >nul 2>&1 Logman.exe delete ts-CPU >nul 2>&1 for /f "tokens=2 delims=_." %%t in ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') do set timestamp=%%t echo %timestamp% echo MM: %timestamp:~0,2% echo dd: %timestamp:~2,2% echo hh: %timestamp:~4,2% echo mm: %timestamp:~6,2% endlocal exit /b 0
-
TYPEPERF を使用して、高速化を図ります異なる言語設定と可能な限り高速で互換性があります:
@echo off setlocal :: Check if Windows is Windows XP and use Windows XP valid counter for UDP performance ::if defined USERDOMAIN_roamingprofile (set "v=v4") else (set "v=") for /f "tokens=4 delims=. " %%# in ('ver') do if %%# GTR 5 (set "v=v4") else ("v=") set "mon=" for /f "skip=2 delims=," %%# in ('typeperf "\UDP%v%\*" -si 0 -sc 1') do ( if not defined mon ( for /f "tokens=1-7 delims=.:/ " %%a in (%%#) do ( set mon=%%a set date=%%b set year=%%c set hour=%%d set minute=%%e set sec=%%f set ms=%%g ) ) ) echo %year%.%mon%.%date% echo %hour%:%minute%:%sec%.%ms% endlocal
-
MSHTA では、上記の#3で示したJScriptメソッドに似たJavaScriptメソッドを呼び出すことができます。月の値を含むJavaScriptのDateオブジェクトプロパティには、1〜12ではなく0〜11の番号が付けられていることに注意してください。したがって、値9は10月を意味します。
<!-- : Batch portion @echo off setlocal for /f "delims=" %%I in ('mshta "%~f0"') do set "now.%%~I" rem Display all variables beginning with "now." set now. goto :EOF end batch / begin HTA --> <script> resizeTo(0,0) var fso = new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1), now = new Date(), props=['getDate','getDay','getFullYear','getHours','getMilliseconds','getMinutes', 'getMonth','getSeconds','getTime','getTimezoneOffset','getUTCDate','getUTCDay', 'getUTCFullYear','getUTCHours','getUTCMilliseconds','getUTCMinutes','getUTCMonth', 'getUTCSeconds','getYear','toDateString','toGMTString','toLocaleDateString', 'toLocaleTimeString','toString','toTimeString','toUTCString','valueOf'], output = []; for (var i in props) {output.push(props[i] + '()=' + now[props[i]]())} close(fso.Write(output.join('\n'))); </script>
for /f %%# in ('wMIC Path Win32_LocalTime Get /Format:value') do @for /f %%@ in ("%%#") do @set %%@
echo %day%
echo %DayOfWeek%
echo %hour%
echo %minute%
echo %month%
echo %quarter%
echo %second%
echo %weekinmonth%
echo %year%
これは、ローカルに依存せずに動作する alt.msdos.batch.nt の亜種です。
これをテキスト ファイルに記述します。getDate.cmd
-----------8<------8<------------ snip -- snip ----------8<-------------
:: Works on any NT/2k machine independent of regional date settings
@ECHO off
SETLOCAL ENABLEEXTENSIONS
if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
set '%%a'=%%i
set '%%b'=%%j
set '%%c'=%%k))
if %'yy'% LSS 100 set 'yy'=20%'yy'%
set Today=%'yy'%-%'mm'%-%'dd'%
ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%
ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]
:EOF
-----------8<------8<------------ snip -- snip ----------8<-------------
標準エラー出力へのエラー メッセージがなくてもコードを動作させるには、%%a、%%b、%%c の変数割り当てを一重引用符で囲む必要がありました。私のロケール (PT) は、「set =20」のようなものが実行されるループ/解析のある段階でエラーを引き起こしていました。引用符は、代入ステートメントの左側のトークン (空ではあるが) を生成します。
欠点は、ロケール変数名が複雑なことです。「yy」、「mm」、「dd」。でもまあ、誰が気にするだろう!
これを使用します(これも地域非依存(英国)ではありません)
set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
残念ながら、これは地域の設定に影響されませんが、必要なことは行います。
set hour=%time:~0,2%
if "%time:~0,1%"==" " set hour=0%time:~1,1%
set _my_datetime=%date:~10,4%-%date:~4,2%-%date:~7,2%_%hour%%time:~3,2%
ウィキペディアで見つけることができるものを驚かせます。
このコードの最初の4行は、Windows&nbsp; XP Professional以降で信頼できる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
次のスクリプトを使用して、コマンドラインで現在の日付を取得してください:
echo %Date:~0,3%day
別の方法(クレジット):
@For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @(
Set Month=%%A
Set Day=%%B
Set Year=%%C
)
@echo DAY = %Day%
@echo Month = %Month%
@echo Year = %Year%
ここでの私の答えはどちらも、地域の設定によって決まる日と月の順序に依拠していることに注意してください。その回避方法はわかりません。
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip
これはそれほど簡単ではありませんが、より柔軟な方法かもしれません(クレジット):
FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B
FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B
SET date=%mm%%dd%%yyyy%
これは、1行で日付時刻を取得する方法です。
for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %a in ('%date% %time%') do echo %c-%a-%b %d%e
米国では、「yyyy-mm-dd hhmm」が出力されます。地域の設定が異なると、%date%の出力も異なりますが、トークンの順序を変更できます。
別の形式が必要な場合は、トークンを再配置するか、異なる(またはなしの)セパレーターを使用して、エコーステートメントを変更します。
この行を使用してください:
PowerShell -Command "get-date"
簡単な答え:
:: Start - Run , type:
cmd /c "powershell get-date -format ^"{yyyy-MM-dd HH:mm:ss}^"|clip"
:: click into target media, Ctrl + V to paste the result
ロングアンサー
@echo off
:: START USAGE ==================================================================
::SET THE NICETIME
:: SET NICETIME=BOO
:: CALL GetNiceTime.cmd
:: ECHO NICETIME IS %NICETIME%
:: echo nice time is %NICETIME%
:: END USAGE ==================================================================
echo set hhmmsss
:: this is Regional settings dependant so tweak this according your current settings
for /f "tokens=1-3 delims=:" %%a in ('echo %time%') do set hhmmsss=%%a%%b%%c
::DEBUG ECHO hhmmsss IS %hhmmsss%
::DEBUG PAUSE
echo %yyyymmdd%
:: this is Regional settings dependant so tweak this according your current settings
for /f "tokens=1-3 delims=." %%D in ('echo %DATE%') do set yyyymmdd=%%F%%E%%D
::DEBUG ECHO yyyymmdd IS %yyyymmdd%
::DEBUG PAUSE
set NICETIME=%yyyymmdd%_%hhmmsss%
::DEBUG echo THE NICETIME IS %NICETIME%
::DEBUG PAUSE
そして、これは時間部分用の同様のバッチファイルです。
:: http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional time settings
::
:: Gets the time in ISO 8601 24-hour format
::
:: Note that %time% gets you fractions of seconds, and time /t doesn't, but gets you AM/PM if your locale supports that.
:: Since ISO 8601 does not care about AM/PM, we use %time%
::
@ECHO off
SETLOCAL ENABLEEXTENSIONS
for /f "tokens=1-4 delims=:,.-/ " %%i in ('echo %time%') do (
set 'hh'=%%i
set 'mm'=%%j
set 'ss'=%%k
set 'ff'=%%l)
ENDLOCAL & SET v_Hour=%'hh'%& SET v_Minute=%'mm'%& SET v_Second=%'ss'%& SET v_Fraction=%'ff'%
ECHO Now is Hour: [%V_Hour%] Minute: [%V_Minute%] Second: [%v_Second%] Fraction: [%v_Fraction%]
set timestring=%V_Hour%%V_Minute%%v_Second%.%v_Fraction%
echo %timestring%
:EOF
-jeroen
vMax のバッチファイルを使用して回答を作成し、オランダ語で動作するようにします
オランダ語-現状のまま-オリジナルのバッチを壊す%date%
、 date / t
、および date
にいくつかの変更があります-file。
他のWindowsロケールに対してもこれを確認し、結果を報告できる人がいるといいでしょう。
あなたの場所でバッチファイルが失敗する場合、コマンドプロンプトにこれらの2つのステートメントの出力を含めてください:
echo:^ | date
date / t
これは、バッチファイルから取得する必要がある出力のサンプルです。
C:\temp>set-date-cmd.bat
Today is Year: [2011] Month: [01] Day: [03]
20110103
修正されたコードとその理由に関するコメント:
:: https://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional date settings
::
:: 20110103 - adapted by jeroen@pluimers.com for Dutch locale
:: Dutch will get jj as year from echo:^|date, so the '%%c' trick does not work as it will fill 'jj', but we want 'yy'
:: luckily, all countries seem to have year at the end: http://en.wikipedia.org/wiki/Calendar_date
:: set '%%c'=%%k
:: set 'yy'=%%k
::
:: In addition, date will display the current date before the input prompt using dashes
:: in Dutch, but using slashes in English, so there will be two occurances of the outer loop in Dutch
:: and one occurence in English.
:: This skips the first iteration:
:: if "%%a" GEQ "A"
::
:: echo:^|date
:: Huidige datum: ma 03-01-2011
:: Voer de nieuwe datum in: (dd-mm-jj)
:: The current date is: Mon 01/03/2011
:: Enter the new date: (mm-dd-yy)
::
:: date/t
:: ma 03-01-2011
:: Mon 01/03/2011
::
:: The assumption in this batch-file is that echo:^|date will return the date format
:: using either mm and dd or dd and mm in the first two valid tokens on the second line, and the year as the last token.
::
:: The outer loop will get the right tokens, the inner loop assigns the variables depending on the tokens.
:: That will resolve the order of the tokens.
::
@ECHO off
set v_day=
set v_month=
set v_year=
SETLOCAL ENABLEEXTENSIONS
if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
::DEBUG echo toks=%toks%
for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
::DEBUG echo first token=%%a
if "%%a" GEQ "A" (
for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
set '%%a'=%%i
set '%%b'=%%j
set 'yy'=%%k
)
)
)
if %'yy'% LSS 100 set 'yy'=20%'yy'%
set Today=%'yy'%-%'mm'%-%'dd'%
ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%
ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]
set datestring=%V_Year%%V_Month%%V_Day%
echo %datestring%
:EOF
-jeroen
Matthew Johnsonのワンライナーソリューションは、ワンライナーの日付と時刻を取得する説得力のあると便利。
ただし、バッチファイル内から作業するには簡単な変更が必要です。
for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
に基づく関数 wmic
:
:Now -- Gets the current date and time into separate variables
:: %~1: [out] Year
:: %~2: [out] Month
:: %~3: [out] Day
:: %~4: [out] Hour
:: %~5: [out] Minute
:: %~6: [out] Second
setlocal
for /f %%t in ('wmic os get LocalDateTime ^| findstr /b [0-9]') do set T=%%t
endlocal & (
if "%~1" neq "" set %~1=%T:~0,4%
if "%~2" neq "" set %~2=%T:~4,2%
if "%~3" neq "" set %~3=%T:~6,2%
if "%~4" neq "" set %~4=%T:~8,2%
if "%~5" neq "" set %~5=%T:~10,2%
if "%~6" neq "" set %~6=%T:~12,2%
)
goto:eof
良い面: 地域に依存しません。 欠点: システム管理者のみが wmic.exe を実行できます。
使用法:
call:Now Y M D H N S
echo %Y%-%M%-%D% %H%:%N%:%S%
これにより、次のような文字列がエコーされます。
2014-01-22 12:51:53
関数パラメーターは out-Parameters であることに注意してください。つまり、値の代わりに変数名を指定する必要があります。
すべてのパラメータはオプションであるため、 call:Now Y M
は、年と月のみを取得したい場合に有効な呼び出しです。
同様の問題がありました。暗号化されたファイルのFTPサーバーから毎日自動的にダウンロードします。 gpgを使用してファイルを復号化し、ファイルの名前を現在の日付(YYYYMMDD形式)に変更し、復号化したファイルを正しい部門のフォルダーにドロップします。
日付に従ってファイルの名前を変更するためのいくつかの提案を行いましたが、この簡単な解決策に出会うまで運がありませんでした。
for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt
完全に機能しました(つまり、ファイル名は&quot; 2011-06-14.txt&quot;として出力されます)。
これは私が使用したものです:
::Date Variables - replace characters that are not legal as part of filesystem file names (to produce name like "backup_04.15.08.7z")
SET DT=%date%
SET DT=%DT:/=.%
SET DT=%DT:-=.%
7-Zipアーカイブへのバックアップを自動化するためのアイデアがさらに必要な場合は、アイデアを使用または確認できる無料のオープンプロジェクトがあります。 http://wittman.org/ziparcy/
http://sourceforge.net/projects/unxutils/files/
ZIPファイル内で&quot; Date.exe&quot;と呼ばれるものを探します。名前を&quot; DateFormat.exe&quot;に変更します(競合を避けるため)。
Windows system32フォルダーに入れます。
多くの「日付出力」がありますオプション。
ヘルプについては、 DateFormat.exe --h
SETを使用して、出力を環境変数にどのように入れるかわかりません。
ISO日付形式を生成する地域に依存しないソリューション:
rem save the existing format definition
for /f "skip=2 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate') do set FORMAT=%%a
rem set ISO specific format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d yyyy-MM-dd 1>nul:
rem query the date in the ISO specific format
set ISODATE=%DATE%
rem restore previous format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d %FORMAT% 1>nul:
まだ最適化できるもの: 変更されている間、短期間で日付形式を使用すると、他のプロセスが混乱する場合があります。したがって、既存のフォーマット文字列に従って出力を解析することは「より安全」ですが、より複雑になります
:: GetDate.cmd -> Uses WMIC.exe to get current date and time in ISO 8601 format
:: - Sets environment variables %_isotime% and %_now% to current time
:: - On failure, clears these environment variables
:: Inspired on -> https://ss64.com/nt/syntax-getdate.html
:: - (cX) 2017 adolfo.dimare@gmail.com
:: - http://stackoverflow.com/questions/203090
@echo off
set _isotime=
set _now=
:: Check that WMIC.exe is available
WMIC.exe Alias /? >NUL 2>&1 || goto _WMIC_MISSING_
if not (%1)==() goto _help
SetLocal EnableDelayedExpansion
:: Use WMIC.exe to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC.exe Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
IF "%%~L"=="" goto _WMIC_done_
set _yyyy=%%L
set _mm=00%%J
set _dd=00%%G
set _hour=00%%H
set _minute=00%%I
set _second=00%%K
)
:_WMIC_done_
:: 1 2 3 4 5 6
:: %%G %%H %%I %%J %%K %%L
:: Day Hour Minute Month Second Year
:: 27 9 35 4 38 2017
:: Remove excess leading zeroes
set _mm=%_mm:~-2%
set _dd=%_dd:~-2%
set _hour=%_hour:~-2%
set _minute=%_minute:~-2%
set _second=%_second:~-2%
:: Syntax -> %variable:~num_chars_to_skip,num_chars_to_keep%
:: Set date/time in ISO 8601 format:
Set _isotime=%_yyyy%-%_mm%-%_dd%T%_hour%:%_minute%:%_second%
:: -> http://google.com/search?num=100&q=ISO+8601+format
if 1%_hour% LSS 112 set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%am
if 1%_hour% LSS 112 goto _skip_12_
set /a _hour=1%_hour%-12
set _hour=%_hour:~-2%
set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%pm
:: -> https://ss64.com/nt/if.html
:: -> http://google.com/search?num=100&q=SetLocal+EndLocal+Windows
:: 'if () else ()' will NOT set %_now% correctly !?
:_skip_12_
EndLocal & set _isotime=%_isotime% & set _now=%_now%
goto _out
:_WMIC_MISSING_
echo.
echo WMIC.exe command not available
echo - WMIC.exe needs Administrator privileges to run in Windows
echo - Usually the path to WMIC.exe is "%windir%\System32\wbem\WMIC.exe"
:_help
echo.
echo GetDate.cmd: Uses WMIC.exe to get current date and time in ISO 8601 format
echo.
echo %%_now%% environment variable set to current date and time
echo %%_isotime%% environment variable to current time in ISO format
echo set _today=%%_isotime:~0,10%%
echo.
:_out
:: EOF: GetDate.cmd
機能的な形式での参照用に、既知の地域を指定します。 ECHOTIMESTAMP
呼び出しは、タイムスタンプを変数(この例では DTS
)に取得する方法を示しています。
@ECHO off
CALL :ECHOTIMESTAMP
GOTO END
:TIMESTAMP
SETLOCAL EnableDelayedExpansion
SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2!
SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2!
SET DTS=!DATESTAMP: =0!-!TIMESTAMP: =0!
ENDLOCAL & SET "%~1=%DTS%"
GOTO :EOF
:ECHOTIMESTAMP
SETLOCAL
CALL :TIMESTAMP DTS
ECHO %DTS%
ENDLOCAL
GOTO :EOF
:END
EXIT /b 0
そして、timestamp.batファイルに保存されます。出力は次のとおりです。
Windows 7では、このコードは私のために機能します:
SET DATE=%date%
SET YEAR=%DATE:~0,4%
SET MONTH=%DATE:~5,2%
SET DAY=%DATE:~8,2%
ECHO %YEAR%
ECHO %MONTH%
ECHO %DAY%
SET DATE_FRM=%YEAR%-%MONTH%-%DAY%
ECHO %DATE_FRM%
できるだけ短くするのが望ましいので、月と年がなくても毎日更新するには十分です
SET date=%DATE:~0,2%
SET hour=%TIME:~0,2%
SET minute=%TIME:~3,2%
IF "%date:~0,1%"==" " SET date=0%DATE:~1,1%
IF "%hour:~0,1%"==" " SET hour=0%TIME:~1,1%
IF "%minute:~0,1%"==" " SET minute=0%TIME:~1,1%
SET VERSION=%date%%hour%%minute%
ECHO VERSION=%date%%hour%%minute%
VERSION=140105
ビルダーの毎日の更新の新鮮な状態でデプロイするアプリケーションのバージョンになると
steps:
- name: "gcr.io/cloud-builders/gcloud"
args: ["app", "deploy", '--version=v1-140105-fresh']
timeout: "300s"
これにより、アプリケーション全体を自動的に更新するのが簡単になります
sed -e "s/-[0-9]\{1,\}-fresh/-%VERSION%-local/g" cloudbuild.yaml > tmp.txt
mv -f tmp.txt cloudbuild.yaml
出力ファイルは、ファイル名を変更せずにローカル更新の準備ができます
steps:
- name: "gcr.io/cloud-builders/gcloud"
args: ["app", "deploy", '--version=v1-140117-local']
timeout: "300s"
すでに述べた多くの方法があることを知っています。しかし、それがどのように行われるかを理解するためにそれを分解する私の方法です。うまくいけば、段階的な方法が好きな人に役立つでしょう。
:: Check your local date format
echo %date%
:: Output is Mon 08/15/2016
:: get day (start index, number of characters)
:: (index starts with zero)
set myday=%DATE:~0,4%
echo %myday%
:: output is Mon
:: get month
set mymonth=%DATE:~4,2%
echo %mymonth%
:: output is 08
:: get date
set mydate=%DATE:~7,2%
echo %mydate%
:: output is 15
:: get year
set myyear=%DATE:~10,4%
echo %myyear%
:: output is 2016
o / pは地域に依存しない解決策を要求しなかったことに注意しました。私の解決策は英国向けですが。
これは、バッチファイルで使用するための最も簡単なソリューション、1行のソリューションです。
FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%