予測可能な形式でバッチファイルの日付を取得する方法は?


17

バッチファイルでは、dateコマンドから月、日、年を抽出する必要があります。そこで、基本的にDateコマンドを解析してそのサブ文字列を変数に抽出する以下を使用しました。

set Day=%Date:~3,2%
set Mth=%Date:~0,2%
set Yr=%Date:~6,4%

これはすべて素晴らしいことですが、このバッチファイルを異なる地域/国の設定でマシンに展開すると、月、日、年が異なる場所にあるため失敗します。

日付形式に関係なく、月、日、年をどのように抽出できますか?


1
絶対にバッチに制限されていますか?このようなことは、VBScript / WSHおよび/またはPowerShellではるかに簡単です...
Adrien

@Adrien、はい、バッチに制限されています-これはVS2008のビルド後ステップの一部です。
AngryHacker

%date%を%date:
〜6,4

回答:


14

ソース:http : //ss64.com/nt/syntax-getdate.html

方法2(単一のcmd)

GetDate.cmd

@Echo off
:: Check WMIC is available
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error

:: Use WMIC to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
   IF "%%~L"=="" goto s_done
      Set _yyyy=%%L
      Set _mm=00%%J
      Set _dd=00%%G
      Set _hour=00%%H
      SET _minute=00%%I
)
:s_done

:: Pad digits with leading zeros
      Set _mm=%_mm:~-2%
      Set _dd=%_dd:~-2%
      Set _hour=%_hour:~-2%
      Set _minute=%_minute:~-2%

:: Display the date/time in ISO 8601 format:
Set _isodate=%_yyyy%-%_mm%-%_dd% %_hour%:%_minute%
Echo %_isodate%
pause

ここに画像の説明を入力してください


方法1(cmd + vb)

GetDate.cmd

@Echo off
For /f %%G in ('cscript /nologo getdate.vbs') do set _dtm=%%G
Set _yyyy=%_dtm:~0,4%
Set _mm=%_dtm:~4,2%
Set _dd=%_dtm:~6,2%
Set _hh=%_dtm:~8,2%
Set _nn=%_dtm:~10,2%
Echo %_yyyy%-%_mm%-%_dd%T%_hh%:%_nn%

getdate.vbs

Dim dt
dt=now
'output format: yyyymmddHHnn
wscript.echo ((year(dt)*100 + month(dt))*100 + day(dt))*10000 + hour(dt)*100 + minute(dt)

1
ああ、ロケールの日付の順序を見つける非常にきちんとした方法。ss64には、cmd.exeユーザーの気の利いたコミュニティがあります。
ニチョリ

ソースリンクから両方のスクリプトを含めました。あなたのために大丈夫
-nixda

@nixda問題ありません、ユーザーが何を助けても。
テックスヘキサ

上記の「方法2」で秒を保持する必要がある場合は、他の要素のように、先頭にゼロを追加するSet _second=00%%Kときに追加wmicします。
ティムパレン

12

Windows XP以降

getDate.cmd

@echo off
for /f "tokens=2 delims==" %%G in ('wmic os get localdatetime /value') do set datetime=%%G

set year=%datetime:~0,4%
set month=%datetime:~4,2%
set day=%datetime:~6,2%

echo %year%/%month%/%day%

出力

ここに画像の説明を入力してください


最も簡潔な答えを得るために+1。また、ECHO %year%-%month%-%day%ISOおよびファイルシステム互換のフォーマットで終わることをお勧めします(もちろん、年月日で自動的にソートされます)。:-)。
ゼパンシュレーダー

3

私はそれがまさにあなたが求めたものではないことを知っていますが、Linux dateアプリケーションのWindowsポートをバッチファイル内のコマンドから使用し、結果を変数に割り当てます。

バッチコマンドのみを使用して日付を確実に取得する方法をまだ見つけていません。


2

YYYY-MM-DD形式にはこのバッチファイルを使用します。これは、すべての最新のWindowsバージョンに存在するウィンドウインストルメンテーションツールを使用して、地域の設定に依存しない日時文字列を取得します。

パス(例)c:\ windows \ rdate.batにバッチファイルに保存してから、CALL RDATE.BATを使用してアクセスし、変数を設定します。または、コードをバッチファイルにコピーします。

この日付形式は、ファイル名とロギングに適しています。正しくソートされます。logtime変数は、日付と時刻の変数をYYYY-MM-DD-HHMMSSとして追加し、バッチファイルアクティビティのログを2番目の精度で記録するのに適しています。

必要に応じて日付(および時刻)形式を調整します。本番環境で画面がエコーするREM。各テキスト選択の2つの数字は、ゼロベースの開始文字インデックスとコピーする文字数です。たとえば、%datetime:〜0,4%は、位置0から始まる4文字の部分文字列を取ります。

echo off
rem First, get the locality-invariant datetime
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
rem echo %datetime%

rem Build the reverse date string YYYY-MM-DD
set rdate=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2%
echo rdate=%rdate%

rem Built a datetime string YYYY-MM-DD-hhmmss
set logtime=%rdate%-%datetime:~8,6% 
echo logtime=%logtime%

1
and31415の回答とほぼ同じです。両方のスクリプトが使用するwmic os get localdatetime
-nixda

1

VS 2008がバッチファイルを出力するのは正しいことですが、Powershellスクリプトやその他のプログラムなど、必要なほとんどすべてのプログラムを実行できます。

編集:

同様の質問がいくつかあります。

/programming/1051845/visual-studio-2008-professional-build-process /programming/3049369/embed-application-compilation-time-stamp

もともと、私はこれをSOに移行するつもりでした。。。


0

NET TIME \\%ComputerName%代わりに使用してみましたDATEか?NET TIMEロケールに関係なく、一貫した形式でデータを提供することになっていると思います。


いいえ、そうではありません。
AngryHacker

興味深いことに、AUとUSの形式を切り替えて、net time常にm / d / yyyy形式で出力してみました。@AngryHacker、どの設定で動作しなかったのですか?
-Hydaral

1
フランス語(ベルギー)を切り替えて、2011-07-27をくれました。米国は2011
-AngryHackerを

0

Shekharの投稿のおかげで、これは必要に応じて機能し、時間の詰め込みはありません。

@Echo Off

for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%%date:~4,2%%date:~7,2%-%%d%%e

set datetimestr=%var: =0%

set logfile=LogFile-%datetimestr%.txt

echo %logfile%

出力:LogFile-20151113-0901.txt


-1

これはやや話題にならないかもしれませんが、ここに私が自分のスケジュールされたバックアップのために書いた.batファイルがあり、またVisual Studioのポストビルドアクションから呼び出します。一部の人がそれを役に立つと思うことを願っています。

以下を.batファイルに保存します

--------------------------------------------------
**:: The following is Copyright © 2012 ShopNetNuke Corp.  All rights reserved.
::  and released under the GNU General Public License (GPLv3)**

:: The following section retrieves the current date and time and formats it into the '%var%' variable
:: This format always ensures that the Date and Time are fixed length to avoid the situation of
:: having a value of '12/ 1/2012 rather than '12/01/2012'
echo off
for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%-%date:~4,2%-%date:~7,2%-%%d-%%e
set var=%var: =0%
echo Beginning my valuable Backup Set:  Backup--%var%

:: If you wanted to request the user input a filename prefix, 
:: then we would use something similar to this
:: set /p nameprefix= Enter the file name prefix?
:: Get the Current Date and Time
::for /f "tokens=1-5 delims=:" %%d in ("%time%") do set var=%date:~10,4%-%date:~4,2%-%date:~7,2%-%%d-%%e
:: set var=%var: =0%
:: echo Beginning my valuable Backup Set:  Backup--%var%_%nameprefix%

Pause

echo Starting SQL Server Database Backup Job...
:: The following line initiates the Backup job within SqlServer Agent.
:: Change 'MyBackupNameInSqlAgent' to the name of the job you want executed
:: Change the directory paths to those relevant to your current system installation directories
:: SqlAgent will not return a value if the backup action succeed, 
:: however, in the event an error is encountered, it will be echoed onto the screen
"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe" -S SQLSERVERNAME\INSTANCENAME -Q "execute msdb.dbo.sp_start_job @job_name = 'MyBackupNameInSqlAgent'"
:: An error will be returned if the Backup job is not found or has already been triggered by another process

echo Starting My Valuable Source Code Directory Backup...

echo ...backing up files and folders in "C:\Source\MyPreciousProjectDirectory\"...
:: The following line will execute the 7zip command to create a .7z file of the directory named in 'MyPreciousProjectDirectory'
:: and tells it to put the archive in the 'MyPreciousBackupDirectory'.  The compression level will be defined by the 7zip default settings
:: The -p flag tells 7zip to password protect the archive, in this case, I've used the Date/Time portion of the filename as the password
:: remove the '-p%var%' section to remove password protection from the archive
"C:\Program Files\7-Zip\7z.exe" a -t7z C:\MyPreciousBackupDirectory\%var%\MyPreciousProject--%var%.7z -p%var% -mhe C:\Source\MyPreciousProjectDirectory\* 

echo Source Code Directory Backups complete.

echo Archiving Database Backups now...
:: The following line will execute the 7zip command to archive the Database backup.
:: The '*' could be replaced by the actual backup name.
:: The '*' indicates all files of type '.bak'
:: The -p flag tells 7zip to password protect the archive, in this case, again, I've used the Date/Time portion of the filename as the password
:: remove the '-p%var%' section to remove password protection from the archive
"C:\Program Files\7-Zip\7z.exe" a -t7z  C:\MyPreciousBackupDirectory\%var%\MyPreciousProject-Database-%var%.7z -p%var% -mhe "C:\Program Files\Microsoft SQL Server\MSSQL10.SQLDEV08\MSSQL\Backup\*.bak"

echo Database Backup Archival process complete.

:: If you wanted to place both the previous backups into one single combination archive,
:: you could do something like the following
"C:\Program Files\7-Zip\7z.exe" a -t7z C:\MyPreciousBackupDirectoryForSourceAndDatabase\%var%\MyPreciousProjectBackupSourceAndDatabase--%var%.7z -p%var% -mhe C:\Source\MyPreciousProjectDirectory\* 


echo Now attempting to copy archives to Network Server...
:: The following line will use xcopy to copy the arechives to the server backup directory and place them in a directory named by the DateTime variable %var%
xcopy /S /I /J /Y C:\MyPreciousBackupDirectory\%var% \\MyPreciousBackupServerName\SourceCode\MyPreciousServerBackupDirectory\%var%
:: Or if the combination above was used then copy that...
xcopy /S /I /J /Y C:\MyPreciousBackupDirectoryForSourceAndDatabase\%var% \\MyPreciousBackupServerName\SourceCode\MyPreciousServerBackupDirectory\%var%


echo 7z Archive files transferred to MyPreciousBackupServerName successfully
echo  ||
echo \||/
echo  \/
echo ---------------------------------------------------
echo ----- BACKUP SET "%var%" COMPLETE ------
echo ---------------------------------------------------
pause

1
tl; drには、スクリプトの動作に関する説明を追加できます。すぐに解決策として出てこないからです。また、コードの適切でない部分を削除できる場合は、より便利かもしれません
Shekhar

1
全体のバッチスクリプトはに依存している%date%%time%ロケール対応している変数、およびOPが尋ねたとして、実際に予測可能な方法で解析することはできません。
および31415 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.