February 1, 2016

コマンドプロンプトでロケールに左右されずにファイル名に日時を設定したい

バッチファイルを配布するときに厄介なのが、%DATE%や%TIME%といった変数はロケールによって出力が変わってしまう点です。色々と解決法は議論されているようなのですが、以下の解決法は別のファイルを必要とせず、バッチファイルの一部を変更するだけで実装可能で最も優れた解決案のようです。

XP以降(?)ではWSHスクリプトをバッチファイルに混在して記載できるため、JScript側で日時を取得して処理し、それをシェルスクリプトに返してやることで、ロケールに依存しない日時の文字列を得ることができるようです。

DATE/TIMEコマンドやDATE/TIME環境変数の形式は地域に依存します。

「地域と言語のオプション」の影響を受けないようにするには、DATE/TIMEコマンドやDATE/TIME環境変数を使わず、WSHスクリプトを使うのが一番です。

@if(0)==(0) ECHO OFF
FOR /F %%0 IN ('CScript.exe //NoLogo //E:JScript "%~f0"') DO SET yyyymmddhhmmss=%%0
ECHO %yyyymmddhhmmss%
GOTO :EOF
@end
var d=new Date();
WScript.Echo(d.getFullYear()*10000000000+(d.getMonth()+1)*100000000+d.getDate()*1000000+d.getHours()*10000+d.getMinutes()*100+d.getSeconds());
http://scripting.cocolog-nifty.com/blog/2007/01/datetimedatetim_061c.html
では、この仕組みがどのように機能するか、というところなのですが、とても面白くて、こちらの記事に解説されています。上手い仕組みがあるものですね。
BATとWSHのコードを1ファイルに混在させるためのshebang記法(複雑なバッチを1ファイルで実現)
http://computer-technology.hateblo.jp/entry/20131025/p1

No comments :

Post a Comment