120

現在の日付を YYYY-MM-DD 形式で Windows .bat ファイルの変数に保存するにはどうすればよいですか?

Unix シェル アナログ:

today=`date +%F`
echo $today
4

17 に答える 17

171

を使用して、ロケールに依存しない方法で現在の日付を取得できます

for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x

次に、部分文字列を使用して個々の部分を抽出できます。

set today=%MyDate:~0,4%-%MyDate:~4,2%-%MyDate:~6,2%

個々のパーツを含む変数を取得する別の方法は次のとおりです。

for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%

変数の名前空間を汚染することを犠牲にして、部分文字列をいじるよりもはるかに優れています。

現地時間の代わりに UTC が必要な場合、コマンドはほぼ同じです。

for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
于 2012-06-08T09:02:34.097 に答える
43

date /Tコマンドプロンプトでフォーマットを見つけるために使用します。

日付形式が次のThu 17/03/2016ように使用されている場合:

set datestr=%date:~10,4%-%date:~7,2%-%date:~4,2%
echo %datestr%
于 2016-03-03T12:57:27.420 に答える
41

バッチ ファイルで標準の MS-DOS コマンドを使用してこれを実現したい場合は、次を使用できます。

FOR /F "TOKENS=1 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET dd=%%A
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2,3 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET yyyy=%%C

これはさらに改善できると確信していますが、これにより、日付が日 (dd)、月 (mm)、年 (yyyy) の 3 つの変数になります。これらは、後で必要に応じてバッチ スクリプトで使用できます。

SET todaysdate=%yyyy%%mm%%dd%
echo %dd%
echo %mm%
echo %yyyy%
echo %todaysdate%

この質問に対する回答が受け入れられていることは理解していますが、この代替方法は、WMI コンソールを使用せずにこれを達成しようとしている多くの人に高く評価される可能性があるため、この質問に何らかの価値が追加されることを願っています.

于 2014-05-20T08:59:29.450 に答える
11

@ProViの回答に従って、必要なフォーマットに合わせて変更するだけです

echo %DATE:~10,4%-%DATE:~7,2%-%DATE:~4,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%

戻ります

yyyy-MM-dd hh:mm:ss
2015-09-15 18:36:11

編集 @Jeb コメントによると、上記の時刻形式は、DATE /T コマンドが返された場合にのみ機能します。

ddd dd/mm/yyyy
Thu 17/09/2015

ロケールに合わせて編集するのは簡単ですが、関連する %DATE% 環境変数によって返される文字列内の各文字のインデックスを使用することで、必要な文字列の部分を抽出できます。

例えば。%DATE~10,4% を使用すると、DATE 環境変数が展開され、展開された結果の 11 番目 (オフセット 10) の文字から始まる 4 文字のみが使用されます。

たとえば、米国スタイルの日付を使用する場合、次が適用されます

ddd mm/dd/yyyy
Thu 09/17/2015

echo %DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
2015-09-17 18:36:11
于 2015-09-15T08:42:32.857 に答える
8

私は Joey の方法がとても気に入りましたが、少し拡張したいと思いました。

このアプローチでは、コードを複数回実行できますが、古い日付値は既に定義されているため、「残っている」ことを心配する必要はありません。

このバッチ ファイルを実行するたびに、ISO 8601 互換の結合された日付と時刻の表現が出力されます。

FOR /F "skip=1" %%D IN ('WMIC OS GET LocalDateTime') DO (SET LIDATE=%%D & GOTO :GOT_LIDATE)
:GOT_LIDATE
SET DATETIME=%LIDATE:~0,4%-%LIDATE:~4,2%-%LIDATE:~6,2%T%LIDATE:~8,2%:%LIDATE:~10,2%:%LIDATE:~12,2%
ECHO %DATETIME%

このバージョンでは、同じコードをファイル内の複数の場所にコピー/貼り付けしないように注意する必要があります。ラベルが重複する可能性があるためです。各コピーに個別のラベルを付けるか、このコードを独自のバッチ ファイルに入れ、必要に応じてソース ファイルから呼び出すことができます。

于 2014-03-20T15:45:27.643 に答える
5

%date%変数を使用するだけです:

echo %date%
于 2013-01-16T12:26:37.863 に答える
3

これを行うことで、環境変数を必要な数値形式の値に設定します。

FOR /F "tokens=1,2,3,4 delims=/ " %a IN ('echo %date%') DO set DateRun=%d-%b-%c
于 2015-03-30T22:48:34.147 に答える
2

ループを使用して PowerShell を使用し、その出力を環境変数にリダイレクトすることができます。

コマンドラインから ( cmd):

for /f "tokens=*" %a in ('powershell get-date -format "{yyyy-MM-dd+HH:mm}"') do set td=%a

echo %td%
2016-25-02+17:25

バッチファイルでは、次のようにエスケープでき%aます%%a

for /f "tokens=*" %%a in ('powershell get-date -format "{yyyy-MM-dd+HH:mm}"') do set td=%%a
于 2016-09-02T21:43:49.407 に答える