バッチスクリプトから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
の戻り値に設定し、それを使用してファイル名を作成する方法があるでしょうか。
変数内のシンボルは、次を使用して置き換えることができます。
set _date=%DATE:/=-%
私は常に使用します:
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
日付と時刻のフォルダー/ファイルを使いやすくするため。
私は非常によく似た質問への回答を投稿しました ここ 。フィールドの日付の分割は、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 =年) 。
Zip some_options "archive_%date:/=-%.Zip"
/=-
は/
マイナス記号付き。
このかなり恐ろしいコードは、あなたが望むようなことをするはずです
move "Filename.txt" "Filename%date:~6,4%%date:~3,2%%date:~0,2%_%Time:~0,2%%Time:~3,2%%Time:~6,2%.txt"
ファイル名を適切に変更した場合。
あなたの質問はWindowsとしてタグ付けされているので、古き良き.batファイルで機能するこの解決策を見つけました:
"MMDDYYYY形式で現在の日付を取得するためのWindowsバッチファイル(.bat)" 、
そしておそらくあなたのケースに適応させることができます:
反響する
@ REM Seamonkeyのクイック日付バッチ(MMDDYYYY形式)
@ REMセットアップ%date変数
@ REM最初に月、日、年をmm、dd、yyyy形式に解析し、次に結合してMMDDYYYYにします/ Fの場合「TOKENS = 1 * DELIMS =」%% A IN( 'DATE/T')CDATE = %% Bを設定してください
FOR/F“ TOKENS = 1,2 eol =/DELIMS = /” %% A IN( 'DATE/T')DO SET mm = %% B
FOR/F“ TOKENS = 1,2 DELIMS =/eol = /” %% A IN( ’echo%CDATE%’)DO SET dd = %% B
FOR/F“ TOKENS = 2,3 DELIMS = /” %% A IN( ’echo%CDATE%’)DO SET yyyy = %% Bv vSET date =%mm %% dd %% yyyy%
これは、%date変数をMMDDYYYY形式の今日の日付に設定するだけなので、後でスクリプトで呼び出すことができます。
編集
より良い構文が見つかりました。私の日付が今日の "2009年9月28日月曜日"であるとすると、
設定日=%日付:〜0,2%
月を設定=%日付:〜7,2%
年を設定=%日付:〜10,4%
純粋なcmd.exeバージョンとgnuwin32-'date 'の組み合わせ:
%> for /F "usebackq" %d in ( `date.exe +"%y%m%d"` ) do Zip archive_%d.Zip <folder>
/ f "tokens = 1,2,3,4,5 delims = /。"の場合、(%% a in( 'date/T')do set CDate = %% d-%% b-%% c
@エコーデータ=%CDate%
これは、現在最も一般的な年月日です
みんなの意見をまとめると、自分に合ったものが得られると思います。これは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つのストリングで名前が付けられます。
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
%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
を使用する必要さえありません。
Zip [...] archive_`echo %DATE% | tr / -`.Zip
うまくいくはずです。
一方、おそらくdate
コマンドが利用可能です(Windowsは知りません)。はいの場合は、次のようにします。
Zip [...] archive_`date +'%Y-%m-%d'`.Zip