Windows cmdスクリプト内から現在の日、月、年を取得するにはどうすればよいですか?各値を個別の変数に入れる必要があります。
ロケールに依存せずに動作するスクリプトのバリアント。 .cmd拡張子の付いたテキストファイルに入れて実行します。
::: Begin set date
for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (call :set_date %%i %%j %%k %%l)
goto :end_set_date
:set_date
if "%1:~0,1%" gtr "9" shift
for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo,^|date') do (set %%m=%1&set %%n=%2&set %%o=%3)
goto :eof
:end_set_date
::: End set date
echo day in 'DD' format is %dd%; month in 'MM' format is %mm%; year in 'YYYY' format is %yy%
変数%dd%、%mm%、%yy%は、それぞれ日( 'DD'形式)、月( 'MM'形式)、年( 'YYYY'形式)を保持します。
年、月、日を取得するには、%date%
環境変数と:~
演算子。 %date%
は、Thu 08/12/2010や:~
を使用すると、変数から特定の文字を選択できます。
set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set filename=%year%_%month%_%day%
つかいます %time%
同様の方法で、現在の時刻から必要なものを取得します。
set /?
は、特別な演算子と変数の使用に関する詳細情報を提供します。
echo %Date:~7,2% gets current day
7は開始位置2の表示桁数です
echo %Date:~7,2% gets current day
echo %Date:~4,2% gets current month
echo %Date:~10,4% gets current year
言語の独立性:
Andrei Coscodanソリューションは言語に依存しているので、修正するための方法は、対象言語の年、月、日の各フィールドのすべてのタグを予約することです。解析が最終セットを次のように行った後、ポルトガル語と英語を検討してください。
set Year=%yy%%aa%
set Month=%mm%
set Day=%dd%
年設定を探して、英語とポルトガル語の両方のタグを使用しました。ブラジルでは、これら2つの言語がWindowsのインストールで最も一般的に使用されていました。これは、フランス語やスペイン語など、ラテン語を起源とする一部の言語でも機能することを期待しています。
完全なスクリプトは次のようになります。
@echo off
setlocal enabledelayedexpansion
:: Extract date fields - language dependent
for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (
set v1=%%i& set v2=%%j& set v3=%%k
if "%%i:~0,1%%" gtr "9" (set v1=%%j& set v2=%%k& set v3=%%l)
for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo.^|date') do (
set %%m=!v1!& set %%n=!v2!& set %%o=!v3!
)
)
:: Final set for language independency (English and Portuguese - maybe works for Spanish and French)
set year=%yy%%aa%
set month=%mm%
set day=%dd%
:: Testing
echo Year:[%year%] - month:[%month%] - day:[%day%]
endlocal
pause
これが、異なる言語を扱う人に役立つことを願っています。
このバリアントは、すべてのローカライズで機能します。
@echo off
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
if "%%B" NEQ "" (
SET /A FDATE=%%F*10000+%%D*100+%%A
)
)
@echo on
echo date=%FDATE%
echo year=%FDATE:~2,2%
echo month=%FDATE:~4,2%
私が知っている唯一確実な方法は、VBScriptを使用してあなたのために重い仕事をすることです。バッチファイルのみで現在の日付を使用可能な形式で取得する移植可能な方法はありません。次のVBScriptファイル
Wscript.Echo("set Year=" & DatePart("yyyy", Date))
Wscript.Echo("set Month=" & DatePart("m", Date))
Wscript.Echo("set Day=" & DatePart("d", Date))
このバッチスニペット
for /f "delims=" %%x in ('cscript /nologo date.vbs') do %%x
echo %Year%-%Month%-%Day%
ただし、動作するはずです。
バッチファイルで現在の日付を取得するには、date /t
または %date%
疑似変数。両方とも、表示される現在のロケールに従います。これは、潜在的にany形式で日付を取得し、それを解析する方法がないことを意味します。
Andrei Coscodanの答えは、多くの仮定を立てることができない場合に最適だと思います。ただし、いくつかの仮定を立てることができる場合は、one-linerが良い場合があります。このソリューションは、「date\t」が2つの形式のいずれかを返すことを前提としています。 WindowsXPでは 'date/t'は "11/23/2011"を返しますが、Windows7では "Wed 11/23/2011"を返します。
FOR /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set mm=%%a&set dd=%%b&set yyyy=%%c& (if "%%a:~0,1" gtr "9" set mm=%%b&setdd=%%c&set yyyy=%%d))
:: Test results
echo day in 'DD' format is '%dd%'; month in 'MM' format is '%mm%'; year in 'YYYY' format is '%yyyy%'
Andrei Consodanの回答に感謝します。この1行のソリューションで私を助けてくれました。
- 1行で!
2つの区切り文字(等しい+ドット)でforループを使用してみてください:=.
:
@for /f "tokens=2delims==." %i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')do @cmd/v/c "set _date=%i &&echo/ year: !_date:~0,4!&&echo/month: !_date:~4,2!&&echo/ day: !_date:~6,2!"
コマンドラインの結果:
year: 2019
month: 06
day: 12
- 任意の言語/地域で動作し、出力レイアウトでユーザー設定もありません。
Batファイルの場合:
@for /f "tokens=2delims==." %%i in ('wmic OS Get localdatetime /value ^|findstr /r [0-9]')do @cmd/v/c "set _date=%%i &&echo/ year: !_date:~0,4!&&echo/month: !_date:~4,2!&&echo/ day: !_date:~6,2!"
私はスクリプトでこの目的のためにPowershell呼び出しを使用するように変換しました。スクリプトの実行許可が必要であり、最も遅いオプションです。ただし、ローカライズに依存せず、書き込みと読み取りが非常に簡単であり、加算/減算などの日付の調整を実行したり、月の最終日を取得するなど、はるかに実行可能です。
日、月、年を取得する方法は次のとおりです
_for /f %%i in ('"powershell (Get-Date).ToString(\"dd\")"') do set day=%%i
for /f %%i in ('"powershell (Get-Date).ToString(\"MM\")"') do set month=%%i
for /f %%i in ('"powershell (Get-Date).ToString(\"yyyy\")"') do set year=%%i
_
または、ここに昨日の日付をyyyy-MM-dd形式で示します
for /f %%i in ('"powershell (Get-Date).AddDays(-1).ToString(\"yyyy-MM-dd\")"') do set yesterday=%%i
曜日
for /f %%d in ('"powershell (Get-Date).DayOfWeek"') do set DayOfWeek=%%d
現在の時刻と15分
for /f %%i in ('"powershell (Get-Date).AddMinutes(15).ToString(\"HH:mm\")"') do set time=%%i
日、月、年を抽出
DATEコマンドもローカライズの対象となるため、最も投票数の多い関数と受け入れられた関数はロケールに依存せずに動作しません。例(受け入れられているもの):英語では年はYYYYであり、オランダではJJJJです。だからこれはノーゴーです。次のスクリプトは、ロケールに依存しないレジストリからユーザーのローカライズを取得します。
@echo off
::: Begin set date
setlocal EnableExtensions EnableDelayedExpansion
:: Determine short date format (independent from localization) from registry
for /f "skip=1 tokens=3-5 delims=- " %%L in ( '2^>nul reg query "HKCU\Control Panel\International" /v "sShortDate"' ) do (
:: Since we can have multiple (short) date formats we only use the first char from the format in a new variable
set "_L=%%L" && set "_L=!_L:~0,1!" && set "_M=%%M" && set "_M=!_M:~0,1!" && set "_N=%%N" && set "_N=!_N:~0,1!"
:: Now assign the date values to the new vars
for /f "tokens=2-4 delims=/-. " %%D in ( "%date%" ) do ( set "!_L!=%%D" && set "!_M!=%%E" && set "!_N!=%%F" )
)
:: Print the values as is
echo.
echo This is the original date string --^> %date%
echo These are the splitted values --^> Day: %d%, Month:%m%, Year: %y%.
echo.
endlocal
年のみを抽出
私が書いたスクリプトについては、年(ロケールに依存しない)のみを抽出したかったので、解決策が見つからなかったため、このonelinerを思いつきました。 「DATE」変数、複数の区切り文字を使用し、31より大きい数値をチェックします。それが現在の年になります。他のソリューションのいくつかとは対照的に、リソースが不足しています。
@echo off
setlocal EnableExtensions
for /f " tokens=2-4 delims=-./ " %%D in ( "%date%" ) do ( if %%D gtr 31 ( set "_YEAR=%%D" ) else ( if %%E gtr 31 ( set "_YEAR=%%E" ) else ( if %%F gtr 31 ( set "_YEAR=%%F" ) ) ) )
echo And the year is... %_YEAR%.
echo.
endlocal