Windowsコマンドライン:現在の日付を名前に含むファイルを作成します


19

バッチスクリプトからzipファイルを作成しようとしています。archive_.zipのような名前にする必要があります

残念ながら、これはスラッシュのためにy / m / dのようなフォーマットのシステムでは機能しません。

zip some_options "archive_%DATE%.zip"

%DATE%変数は次のように展開されます

Mon 09/28/2009

gnuwin32パッケージにアクセスできるので、たとえば、sedスペースとスラッシュをダッシュ​​に置き換えることができます。問題は、の出力をどのように使用しsedてzipアーカイブのファイル名を作成するのですか?

Unix(bash)では、逆引用符を使用してコマンドをその場で評価し、その出力を別のコマンドで使用できます。

zip [...] archive_`echo %DATE% | sed -e s/.../.../`.zip

Windowsで類似したものはありますか?

または、変数に戻り値を設定し、sedそれを使用してファイル名を作成する方法がありますか?

回答:


27

以下を使用して、変数内のシンボルを置き換えることができます。

set _date=%DATE:/=-%

1
これはきちんとしたトリックです!
クリスティディアコネスク

PSスペースやその他の厄介なキャラクターを取り除く「ワンライナー」の方法はありますか?(置換する各文字の3番目... n番目の一時変数を持つのとは対照的に)
Cristi Diaconescu

申し訳ありません。そのようなことはないようです。そのためにはfor構文にフォールバックする必要があります。NB:これはバッチプログラミングの良いリファレンスです:robvanderwoude.com/batchfiles.php
クリストファー

5
これは次の場合よりもさらに高速です%date:~-10,2%-%date:~-7,2%-%date:~-4,4%
ジェスストーン14

誰もあなたの応答ジェス・ストーンを+1しません!私からの+1 !!!
アルボボウエン14年

5

私はいつも使用します:

For /f "tokens=1,2,3,4,5 delims=/. " %%a in ('date/T') do set CDate=%%a%%b%%c%%d

その後、CDateはSat02182012になります。よりソートしやすくしたい場合は、CDateを%% d-%% b-%% cに設定して2012-02-18になります

For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g

日付と時刻のフォルダー/ファイルをわかりやすくするため。


4

私は非常によく似た質問への回答をここに投稿しました。フィールドの日付のスプリッティングは、harrymcの答えの数行ではなく、1行で行われます。

興味深い部分は次のとおりです。

@echo off
for /F "tokens=2-4 delims=/ " %%i in ('date /t') do set yyyymmdd=%%k%%j%%i
echo Date: %yyyymmdd%

そして、警告はまだ関連しています:

警告:日付の形式(yyyymmdd = %% k %% j %% i)は地域の設定によって異なります。フランス語の日付形式(dd / mm / yyyy)を使用するため、形式として "%% k %% j %% i"を使用する必要があります(%% i =日、%% j =月、%% j =年)。

地域設定が米国スタイル(mm / dd / yyyy)に設定されている場合、「%% k %% i %% j」を使用する必要があります(%% i =月、%% j =日、%% j =年) 。


3
zip some_options "archive_%date:/=-%.zip"

をマイナス記号で/=-置き換え/ます。


2

このやや恐ろしいコードは、あなたが望むようなことをするはずです

move "Filename.txt" "Filename%date:~6,4%%date:~3,2%%date:~0,2%_%Time:~0,2%%Time:~3,2%%Time:~6,2%.txt"

ファイル名を適切に変更した場合。


1
怪物を説明することに注意してください?:)
クリスティディアコネスク

それは基本的に日付からビットを切り刻んでファイル名の真ん中に送ります。コマンドラインでエコーを実行してホラーの一部をテストすることができますので、エコー%date:〜6,4%を実行すると年。日付と時刻を部分文字列化するだけです。
コル

面白い。あまりにもポータブルではない、残念ながら...
クリスティDiaconescu

残念ながら、部分文字列の使用に関する問題は、特定の日付形式に依存し、異なる場合に爆発することです。yyyy-MM-ddを使用するように設定された日付があるため、マシンにecho %date:~6,4%%date:~3,2%%date:~0,2%戻ります9-289-20(したがって、今日は2009-09-28です)。
ジョシュア

確かに、私はこのソリューションを1台のマシンでしか使用していないので、それほど問題にはなりません。
コル

2

あなたの質問はWindowsとしてタグ付けされているので、古き良き.batファイルで機能するこのソリューションを見つけました:
"Windowsバッチファイル(.bat)MMDDYYYY形式で現在の日付を取得"
おそらくあなたのケースに適応することができます:

上のエコー
@REM Seamonkeyのの迅速な日付バッチ(MMDDYYYY形式)
@REMセットアップ%日付変数
@REMまずミリメートル、DD、YYYY形式に月、日、年を解析して、MMDDYYYYであることを兼ね備えて

FOR / F“ TOKENS = 1 * DELIMS =” %% A IN( 'DATE / T')DO CDATE = %% B
FOR / F“ TOKENS = 1,2 eol = / DELIMS = /” %% A IN( 「日付/ T」)mm
/ %% Bを/ F「トークン= 1,2デリーム= / eol = /」に設定します%% A IN( 'echo%CDATE%')DO dd = %% Bを
/に設定しますF“ TOKENS = 2,3 DELIMS = /” %% A IN( 'echo%CDATE%')DO SET yyyy = %% Bv vSET date =%mm %% dd %% yyyy%

これは、%date変数をMMDDYYYY形式の今日の日付に設定するだけなので、後でスクリプトで呼び出すことができます。

編集
より良い構文が見つかりました。私の日付が今日「2009年9月28日」であるとすると、
set day =%Date:〜0,2 %
set month =%Date:
〜7,2%set year =%Date:〜10,4%


2

gnuwin32-'date 'と組み合わせた純粋なcmd.exeバージョン:

%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do zip archive_%d.zip <folder>

そのため、インプレース置換を行うことができます!あなたは私に言わせれば、「の」コマンドは... 1つの奇妙な構文を持っている
クリスティDiaconescu

私はそれができないと主張しませんでした:)「cmd」の全体はとにかく狂っています。「for」コマンドは、最初のパスで実際に行を作成(「ループ」を「展開」)してから、「作成」スクリプトを実行します。
アキラ

1

cscript + vbasicの使用はどうですか:

WScript.shell.run "zip archive_" & DatePart("yyyy", Now) & "_" & DatePart("m", Now) & "_" & DatePart("d", Now) & ".zip " & WScript.arguments(0)

経由して呼び出す

cscript /nologo zip_it.vbs

1

/ f "tokens = 1,2,3,4,5 delims = /。"の場合、% 'a in(' date / T ')set set CDate = %% d-%% b-%% c

@echoデータ=%CDate%

これは現在最も一般的な年月日です


1

ユーザーが地域設定を変更した場合、どちらか%DATE%またはの出力を使用するソリューションはすべてdate /t壊れる可能性があります。たとえば、「短い日付」形式を"yyyy-MM-dd"に設定したため、に%DATE%等しくなり"2012-02-18"date /t同じ出力を生成します。(これはWindows 7用です。以前のバージョンのWindowsでも同じだと思います。)

バッチファイルをビルドして実行します。

GNU dateコマンドを使用できるので、次のようなことができます。

C:\path\to\gnu\date "+zip some_options archive_%Y-%m-%d.zip" > tmp.bat
call .\tmp.bat

tmp.bat 次のようなものが含まれます。

zip some_options archive_2012-02-18.zip

これによりtmp.bat現在のディレクトリに作成されることに注意してください。これは問題になる可能性があります。作成する方が良いかもしれません%TEMP%\tmp.bat。また、その後ファイルを削除しませんでした。それは簡単です。

date +FORMAT書式文字列dateと同様に、コマンドの出力形式を指定できますprintf。詳細については、coreutilsの日付のドキュメントを参照してください。形式には任意のテキストを含めることができるため、この場合はを使用する必要さえありませんsed


1

みんなのビットをまとめると、自分に合ったものが得られると思います。これはWindows 2003システム上にあり、パフォーマンスモニターからのトリガーに応答して実行中のプロセスのスナップショットを提供します。

@echo off
For /f "tokens=1,2,3,4,5 delims=/. " %%i in ('date /t') do set CDate=%%k%%j%%i
For /f "tokens=1,2 delims=:" %%f in ('time /t') do set CTime=%%f%%g
tasklist /fo table >tasklist%CDate%%CTime%.txt

出力ファイルは、区切り文字のない1つの文字列で名前が付けられます。


0
zip [...] archive_`echo %DATE% | tr / -`.zip

動作するはずです。

一方、dateコマンドを使用できる可能性があります(Windowsがわかりません)。はいの場合、次のようにします。

zip [...] archive_`date +'%Y-%m-%d'`.zip

バックティックトリックはcmd.exeでは機能しません。また、Windowsの「日付」コマンドはフォーマットを処理できません:(
Cristi Diaconescu

-1

それがあなたに合っているかどうかはわかりませんが、私のコードは

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt

OPは、現在の日付を持つファイルたいファイル名ではなく、中のファイルの内容を
月Doggen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.