更新日:2016年になりました。特にdate
を使用した場合の地域設定の問題が原因で、特に後方互換性のある理由がない限り、これにPowerShellを使用します。 @ npocmaka's 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を使用しています。私はこれを達成するために追加のユーティリティをインストールしたくありません(私はNice日付フォーマットをするであろういくつかがあることを理解していますが)。
MMDDYYYY形式で現在の日付を取得するには、Windowsバッチファイル(.bat)を参照してください:
@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
地域の日/月の順序とは無関係に日付が必要な場合は、ISO順になっているので、ソースとして "WMIC os GET LocalDateTime"を使用できます。
@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
を使って任意のファイルから日付/時刻情報を抽出することもできます。
date.exe +"%Y-%m-%d"
2009-12-22
date.exe +"%T"
18:55:03
date.exe +"%Y%m%d %H%M%S: Any text"
20091222 185503:任意のテキスト
date.exe +"Text: %y/%m/%d-any text-%H.%M"
テキスト:09/12/22-任意のテキスト-18.55
Command: date.exe +"%m-%d """%H %M %S """"
07-22 "18:55:03" `
参照ファイルからの日付/時刻情報date.exe -r c:\file.txt +"The timestamp of file.txt is: %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 toolsの一部 で、インストールは不要です。
注:検索パスにあるディレクトリに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 XPおよびWindows Server 2003のネイティブコマンドではありませんが、 Microsoftサイトからダウンロード にできます。ただし、Windows 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 Script Host の一部としてNT以降のすべてのシステムで利用可能です( ただし、レジストリを介して無効にできますが、まれなケースです ):
@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/BATCHhybrid(一時ファイルを使用せずにバッチファイル内にVBScriptを埋め込み、実行することは可能ですか? file?)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 、 v (Windows 7以降のみ))。 Windows 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 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
WMICを使用したもう1つの方法で、週と曜日を指定しますが、ミリ秒は指定しません(ミリ秒の場合はfoxidriveの答えを確認します) :
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%
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>
これは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%
ウィキペディア で見つけることができるものを驚くべきものにしてください。
コマンドラインで現在の日を取得するには、次のスクリプトを使用してください。
echo %Date:~0,3%day
このコードの最初の4行は、Windows XP Professional以降で信頼できるYY DD MM YYYY HH最小秒変数を提供します。
@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
別の方法( クレジット ):
@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
これはそれほど簡単ではありませんが、もっと柔軟な方法になるでしょう( credit ):
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%出力も異なりますが、トークンの順序を変更できます。
別の形式が必要な場合は、トークンを並べ替えるか、別の(またはなし)区切り文字を使用してechoステートメントを修正してください。
この行を使うだけです:
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
マシュージョンソンの ワンライナーソリューション ワンライナーの日付と時刻を取得するにはeloquentで便利です。
ただし、バッチファイル内から作業するには、簡単な変更が必要です。
for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
そして、これは時間部分の同様のバッチファイルです。
:: 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
にいくつかの変更を加えました。
何人かの人々が同様に他のWindowsロケールに対してこれをチェックし、結果を報告することができればいいでしょう。
バッチファイルがあなたの場所で失敗した場合は、プロンプトにこれら2つのステートメントの出力を含めてください。echo:^|date
date/t
これはbatch-fileから得られるべき出力のサンプルです:
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 [email protected] 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
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
が有効な呼び出しです。
これが私が使ったことです:
::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/
私は同様の問題を抱えていました。暗号化されたファイルをFTPサーバーから毎日自動的にダウンロードします。 gpgを使用してファイルを復号化し、ファイルの名前を現在の日付(YYYYMMDD形式)に変更し、復号化したファイルを正しい部門のフォルダにドロップしたいと思いました。
私は日付に応じてファイルの名前を変更するためのいくつかの提案をしましたが、私がこの単純な解決策に出会うまで運がなかったのです。
for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt
それは完全にうまくいった(すなわち、ファイル名は "2011-06-14.txt"として出てくる)。
http://sourceforge.net/projects/unxutils/files/ /
Zipファイル内で "Date.exe"という名前のものを探し、 "DateFormat.exe"という名前に変更します(競合を避けるため)。
あなたの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 [email protected]
:: - 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"