web-dev-qa-db-ja.com

バッチファイルでロケールに依存しない形式で日付を取得するにはどうすればよいですか?

ファイル名に日付が含まれているファイルを読み込もうとしています。

問題は、システムで日付形式がUSの場合です。mm/dd/yyyy機能しません。

この形式の場合:dd/mm/yyyy期待どおりに機能します。

この形式で日付を取得する必要がありますdd/mm/yyyyそのため、システムはUS形式で設定されています。

私はバッチの初心者で、必要な形式で日付を取得する方法がわかりません。

これが私のバッチファイルです:

for /f "delims=/ tokens=1-3" %%a in ("%date%") do (
rem Lets name our new variable "rdate" for reverse date
set _date=%%a-%%b-%%c
)

set source=%path%.csv
echo %source%
set dest=%path%_%_date%.csv
echo %dest%
3
user3070123

知らない形式のさまざまな形式の日付を解析するのは悪い考えのように思えます。日付を特定の形式で取得する方が良いです。これは、純粋なバッチではなく、PowerShellを呼び出すことを意味します。

C:\Users\tod>for /f %a in ('C:\Windows\System32\WindowsPowershell\v1.0\powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%a

C:\Users\tod>set datetime=2018_01_22__09_15_33

または時間なし。

C:\Users\tod>for /f %a in ('C:\Windows\System32\WindowsPowershell\v1.0\powershell -Command "Get-Date -format yyyy_MM_dd"') do set datetime=%a

C:\Users\tod>set datetime=2018_01_22

C:\Users\tod>

あなたがそれを持ったらあなたはすることができます

C:\Users\tod>echo %datetime:~0,4%
2018

C:\Users\tod>

以下同様に、年、月、月の日付に等しい変数を設定できます。

追加

PowerShellを使用したくなく、これが米国形式の日付でのみ機能することを気にしない場合。

C:\Users\tod>echo %date%
01/22/2018

C:\Users\tod>echo %date:~0,2%
01

C:\Users\tod>echo %date:~3,2%
22

C:\Users\tod>echo %date:~6,4%
2018

C:\Users\tod>

だからあなたは本当にそれを行う方法を見ることができるはずです

set first=%date:~0,2%

set second=%date:~3,2%

set third=%date:~6,4%


C:\Users\tod>set first=%date:~0,2%

C:\Users\tod>set second=%date:~3,2%

C:\Users\tod>set third=%date:~6,4%

C:\Users\tod>echo %first%/%second%/%third%
01/22/2018

C:\Users\tod>echo %second%/%first%/%third%
22/01/2018

C:\Users\tod>

つまり、set ukdate=%second%/%first%/%third%と言うことができ、echo %ukdate%と言うことができます。

そして、その非PowerShellメソッドは、システムの日付の形式がわかっていて、それが米国であることがわかっている場合にのみ機能します。たとえば、OSの新しいリビジョンが登場し、コマンドの出力が少し異なり、コードが解析で特定の形式を想定している場合はどうなるので、一般的にバッチを使用しないことをお勧めします。この場合、バッチはある意味ではきちんとしていますが、スティックを一緒に叩くようなものになることもあります。バッチを知って少し使用することをお勧めしますが、RubyまたはPythonまたはGolangまたはNodeJSのような他のスクリプト言語をインストールすることをお勧めします。このためにバッチのみを使用したい場合は、それがあります。

2
barlop

ロケールに依存しない形式のバッチファイルで日付を取得するにはどうすればよいですか?

この形式で表示する必要がありますdd/mm/yyyy

まず、すべきでないこと:

  • %date%を使用してソリューションを提供することは、他の回答で使用されているように、OSロケール、地域、および言語の設定に依存し、間違った情報または欠落した情報を提供する可能性があります。

  • たとえば、私のPCの短い日付形式では、平日がまったく出力されません。

問題を解決する正しい方法:

  • 一方、wmicの使用は、OSロケール、言語、またはユーザーが選択した日付形式(コントロールパネル/地域)とは無関係に機能します。

次のバッチファイルはwmicを使用して日付と(ローカル)時刻を取得するため、%date%を使用したソリューションの不利な点はありません。

getdate.cmd:

@echo off
setlocal
rem get the date
rem use findstr to strip blank lines from wmic output
for /f "usebackq skip=1 tokens=1-3" %%g in (`wmic Path Win32_LocalTime Get Day^,Month^,Year ^| findstr /r /v "^$"`) do (
  set _day=00%%g
  set _month=00%%h
  set _year=%%i
  )
rem pad day and month with leading zeros
set _month=%_month:~-2%
set _day=%_day:~-2%
rem output format required is DD/MM/YYYY
echo %_day%/%_month%/%_year%
endlocal

出力例:

> getdate
22/01/2018

上記のコードを使用するように、バッチファイルを適切に変更します。次に例を示します。

@echo off
setlocal
rem get the date
rem use findstr to strip blank lines from wmic output
for /f "usebackq skip=1 tokens=1-3" %%g in (`wmic Path Win32_LocalTime Get Day^,Month^,Year ^| findstr /r /v "^$"`) do (
  set _day=00%%g
  set _month=00%%h
  set _year=%%i
  )
rem pad day and month with leading zeros
set _month=%_month:~-2%
set _day=%_day:~-2%
rem output format required is DD/MM/YYYY
set source=%path%.csv
echo %source%
set dest=%path%_%_day%/%_month%/%_year%.csv
echo %dest%
endlocal

参考文献

  • Windows CMDコマンドラインのA-Zインデックス -Windowsコマンドラインに関連するすべてのものの優れたリファレンス。
  • / fの場合 -別のコマンドの結果に対してコマンドをループします。
  • getdate -OSロケール、言語、またはユーザーが選択した日付形式(コントロールパネル/地域)に関係なく、日付と時刻を表示します。
  • variables -変数(部分文字列)の一部を抽出します。
  • wmic --Windows ManagementInstrumentationコマンド。
1
DavidPostill