DOSのfor文でファイル名の後ろに日付を付加する方法

このQ&Aのポイント
  • DOSのバッチを使ってあるフォルダ内の複数のExcelファイルのファイル名の後ろに日付を付ける方法について教えてください。
  • ファイル名の先頭には簡単に日付を付けることができたが、ファイル名の後ろにすると拡張子(xls)が邪魔になるため、他の方法を探しています。
  • どのようにすればファイル名の後ろに日付を付けることができるでしょうか?
回答を見る
  • ベストアンサー

DOSのfor文に関して

コマンドプロンプトからDOSのバッチを動かしています。 for文を使って、あるフォルダ内の、複数のExcelファイルのファイル名の後ろに、日付を付加しようとしています。 ファイル名の先頭には日付を付ける事は簡単に出来たのですが、ファイル名の後ろに付けるとなると拡張子(xls)が邪魔になってしまいます。 何か良い方法があったら教えてください。 set yy=%date:~0,4% set mm=%date:~5,2% set dd=%date:~8,2% cd パス指定 for %%i in (*.xls) do rename %%i "%yy%%mm%%dd%_%%i" 「"%yy%%mm%%dd%_%%i"」で拡張子(xls)が邪魔になる為、現在はファイル名の前に日付を付けています。

  • WWZ
  • お礼率60% (20/33)

質問者が選んだベストアンサー

  • ベストアンサー
  • deadline
  • ベストアンサー率63% (1239/1943)
回答No.1

変数 %%i を %%~ni とすることで、拡張子を除去したファイル名だけを、%%~xi で、拡張子だけを取り出すことが出来ます。 %%~i      全ての引用句 (") を削除して%%iを展開する %%~fi      %%iを完全修飾パス名に展開する %%~di      %%iをドライブ名だけに展開する %%~pi      %%iをパスだけに展開する %%~ni      %%iをファイル名だけに展開する %%~xi      %%iをファイル拡張子だけに展開する %%~si      %%iをMS-DOSの短い名前 (8.3形式) に展開する %%~ai      %%iをファイル属性に展開する %%~ti      %%iをファイルの日付・時刻に展開する %%~zi      %%iをファイルのサイズに展開する 『OKWave:バッチファイル 複数ファイルの存在確認及び、比較方法』 http://bekkoame.okwave.jp/qa5636370.html

WWZ
質問者

お礼

分かり易い説明、有難う御座います。 大変、助かりました。

関連するQ&A

  • バッチファイルの日付を自動化したい

    下の様なバッチファイルの日付を6日16日26日のとき set du=20071001 のduを変数?にして書き換えたいのですが 良きアドバイスをお願い致します。 OS WindowsXp @echo off set du=20071001 :rem ***** 日付入力 ***** set yy=%du:~0,4% set mm=%du:~4,2% set dd=%du:~6,2% set tt=%yy%%mm%%dd% set tu=%mm%-%dd%-%yy% set dir1=C:\Documents and Settings\Owner\My Documents set dir2=d:\backup\ xcopy "%dir1%" "%dir2%%tt%" /i/s/v/y/d:%tu%

  • ファイル名の一部に年月日が入っているファイルを、指定日以前のもののみ一

    ファイル名の一部に年月日が入っているファイルを、指定日以前のもののみ一括削除する方法を教えてください。 上記の目的を果たすためにバッチファイルを作成しようと思っているのですが、当方プログラミング全般に関して全くの素人でして、Web検索で見つけたものを切り貼りして無理やり作ったところ、思うような結果になりませんでした。 (BCPフォルダ直下に当該ファイルを置いた場合削除できたが、サブフォルダのファイルは削除できない) どうもあと一歩で完成しそうな気がするので、できればこのバッチファイルを元に修正していただけると嬉しいのですが、VBScript等で作成した方が簡単なのであればバッチファイル以外の方法でも構いません。 宜しくお願い致します。 <予め決められているルール(変更は不可)> (1)2010年9月2日21時21分55秒14に作成されたファイルは、「201009」フォルダ配下に「ABC_DEF_GHI_2010090221215514.txt」と「ABC_DEF_GHI_2010090221215514.log」という名前がつけられる。 (2)1日1回バッチファイルを起動し、指定日以前に作成したファイルを全て削除する。 <作成したバッチファイル(DEL.bat)> @echo off cd ..\BCP REM --------------- REM 日付のn日前を求める REM 引数1・・・n(数値) REM 引数1がないときは1(前日) REM 引数2・・・YYYY/MM/DD 形式 REM 引数2がないときは本日とする。 REM --------------- if "%1"=="" ( set n=5 ) else ( set n=%1 ) if "%2"=="" ( for /F "tokens=1" %%a in ('date /t') do set orgdate=%%a ) else ( set orgdate=%2 ) :年月日の分割 set yy=%orgdate:~0,4% set mm=%orgdate:~5,2% set dd=%orgdate:~8,2% set count=0 :Repeat :月日の数値化(8進数対策) set /a mm=1%mm%-100 set /a dd=1%dd%-100 set /a dd=%dd%-1 if %dd% NEQ 0 goto end :月跨り処理 set /a mm=%mm%-1 if %mm% EQU 0 set mm=12&&set /a yy=%yy%-1 set /a dd=%dd%+31 if "%mm%"=="2" set /a dd=%dd%-3 if "%mm%"=="4" set /a dd=%dd%-1 if "%mm%"=="6" set /a dd=%dd%-1 if "%mm%"=="9" set /a dd=%dd%-1 if "%mm%"=="11" set /a dd=%dd%-1 :閏年処理 :4で割り切れるか? set /a u=%yy% %% 4 if not %u%==0 goto end :100で割り切れて、400で割り切れないか? set /a u=%yy% %% 400 set /a v=%yy% %% 100 if %v%==0 if not %u%==0 goto end :2月か? if %mm% EQU 2 set /a dd=%dd%+1 :END set mm=0%mm% set mm=%mm:~-2% set dd=0%dd% set dd=%dd:~-2% set /a count=%count%+1 set DT=ABC_DEF_GHI_%yy%%mm%%dd% IF %count% NEQ %n% goto Repeat for %%F in (*.txt *.log) do if %%F LSS %DT% del /s %%F :EXIT <フォルダ構造> 添付画像をご参照下さい。

  • バッチファイル 2つのログに出力 短縮版

    お世話になっております。 WindowsXP環境にて下記のバッチファイルがあります。 コード-------------------------------------------------------------------------------- rem === 変数設定 =============================================================== rem --- 時間変数 --- set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set HH=%TIME:~0,2% set MM2=%TIME:~3,2% set SS=%TIME:~6,2% rem --- フォルダ変数 --- set LOG_DIR1=D:\test rem --- ファイル変数 --- set LOG_FILE1=LOG.txt set LOG_FILE2=LOG_ALL.txt set LOG_FILENAME1=%LOG_DIR1%\%LOG_FILE1% set LOG_FILENAME2=%LOG_DIR1%\%LOG_FILE2% set BAT_FILE1=test.bat rem コマンド拡張機能有効化 setlocal ENABLEEXTENSIONS rem === 変数設定 =============================================================== REM <開始処理>=============== call :TIME echo %BAT_FILE1% 処理日 = %yyyy%%yy%/%mm%/%dd% 処理開始時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME1% echo. >> %LOG_FILENAME1% echo %BAT_FILE1% 処理日 = %yyyy%%yy%/%mm%/%dd% 処理開始時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME2% echo. >> %LOG_FILENAME2% rem 現在の日付/時間を取得 :TIME set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set HH=%TIME:~0,2% set MM2=%TIME:~3,2% set SS=%TIME:~6,2% exit /b コード-------------------------------------------------------------------------------- 上記プログラムは日付を2つのログに出力していますが、 echo %BAT_FILE1% 処理日 = %yyyy%%yy%/%mm%/%dd% 処理開始時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME1% echo. >> %LOG_FILENAME1% echo %BAT_FILE1% 処理日 = %yyyy%%yy%/%mm%/%dd% 処理開始時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME2% echo. >> %LOG_FILENAME2% と二重になっている無駄なコードとなり、見栄えが良くないです。 これを1つのコードで2つのログファイルに出力可能な短縮プログラムは可能でしょうか? ご存知の方がいましたら、ご教授願いますでしょうか? 何卒宜しくお願い致します。

  • 他のシステムからExcelに日付を貼り付ける

    こんばんは。 過去の質問を見ていたのですが、同じような質問を見つけられなかったのでどなたか知ってたら教えてください。 タイトルにあるように他のシステム(Aとします)からExcelに日付をコピー・ペーストしたいのですが、AのフォーマットがDD/MM/YYになっています。 PCの日付の設定自体をRegional OptionsでDD/MM/YYに変えてしまえば話は早いのですが、それをMM/DD/YYにしたままExcelにペーストすると日にちが12日より大きいものはDate型として認識しません。 例えば10/12/03はDateとして認識されますが2003年10月12日として認識されます。(本当は2003年12月10日なんですが。)又、15/12/03(2003年12月15日)はDateではなくGeneralとして認識されます。右クリックformat Cellで日付型に変換しても、CustomizeでDD/MM/YYとしてもやはり日付として認識しません。どうやったらExcelに日付として表示させることができますか?

  • バッチファイル 時間変数 短縮化

    バッチファイル 時間変数 短縮化 お世話になっております。 WindowsXP環境にて下記のバッチファイルがあります。 コード-------------------------------------------------------------------------------- set BAT_FILE=TIME.bat set LOG_DIR=D:\test set LOG_FILE=LOG.txt set LOG_FILENAME=%LOG_DIR%\%LOG_FILE% set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set HH=%TIME:~0,2% set MM2=%TIME:~3,2% set SS=%TIME:~6,2% echo %BAT_FILE% 処理日 = %yyyy%%yy%/%mm%/%dd% 第一処理開始時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME% echo. >> %LOG_FILENAME% 処理A(プログラムは省略) set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set HH=%TIME:~0,2% set MM2=%TIME:~3,2% set SS=%TIME:~6,2% echo %BAT_FILE% 処理日 = %yyyy%%yy%/%mm%/%dd% 第一処理終了時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME% echo. >> %LOG_FILENAME% set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set HH=%TIME:~0,2% set MM2=%TIME:~3,2% set SS=%TIME:~6,2% echo %BAT_FILE% 処理日 = %yyyy%%yy%/%mm%/%dd% 第二処理開始時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME% echo. >> %LOG_FILENAME% 処理B(プログラムは省略) set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set HH=%TIME:~0,2% set MM2=%TIME:~3,2% set SS=%TIME:~6,2% echo %BAT_FILE% 処理日 = %yyyy%%yy%/%mm%/%dd% 第二処理終了時間= %HH%:%MM2%:%SS%>> %LOG_FILENAME% echo. >> %LOG_FILENAME% コード-------------------------------------------------------------------------------- 上記プログラム内の処理A及び、処理Bは比較的長い処理である為、その前後の処理時間帯を上記のように時間変数で取ってログに出力されています。 しかし、上記のように最新の処理時間帯をわざわざ何行もある各時間変数を宣言して取得するのはプログラム的に長くなってしまい、かつ醜いです。 上記方法以外に時間変数のスッキリとした取得方法は無いのでしょうか? ご存知の方がいれば、ご教授願いますでしょうか? 何卒宜しくお願い致します。

  • バッチコマンド【高度なテキストファイル検索方法】

    いつも大変御世話になっております。 使用端末:Windows2000SP4 ツリー構成は以下の(1)~(4)になります。 (1)【E:\test】内にtest.batがあります。 (2)【E:\IFFILE\】内には、テキストファイル(拡張子はtxt)が毎日不定期な数(1ファイルだったり、15ファイルだったり)あります。 (3)【E:\IFFILE\CHK】内には【GOOD】【0_FILE】【No_File】フォルダがあります。 (4)検索対象ファイル:50ファイル 今回悩んでいるの、test.batのコードで、具体的に何をしたいかと言うと・・・ (1)【E:\IFFILE\】内に(4)のファイル名にファイル存在有無の検索をかけます。 検索条件は以下の通りです ・ファイルが存在しない場合(※1) ・ファイルがあるが、サイズが0のファイルが存在する場合(※2) ・ファイルがあり、サイズがあるファイルが存在する場合(※3) (※1)【E:\IFFILE\CHK\No_File】フォルダにそのファイル名ではじまるファイル名にして語尾に日付を付け、 そのファイルの中に【ファイルがありませんでした。】のメッセージを表示。 (※2)【E:\IFFILE\CHK\0_FILE】フォルダにそのファイル名ではじまるファイル名にして語尾に日付を付け、 そのファイルの中に【0件データでした。】のメッセージを表示。 (※3)【E:\IFFILE\CHK\GOOD】フォルダにそのファイル名ではじまるファイル名にして語尾に日付を付け、 そのファイルの中に【データのある正常なデータでした。】のメッセージを表示。 コードは中途半端ですが、下記の通りです。 set yy=%date:~2,4% set mm=%date:~7,2% set dd=%date:~10,2% REM ======================================================= echo %YMD%,%HHMMSS%,"サイズ検索処理開始" REM ======================================================= @echo off for /f %%a in ("E:\IFFILE\L2001.TXT") do set chk=%%~za% if %chk%==0 goto :END echo データのある正常なデータでした。。 >> E:\IFFILE\CHK\GOOD\L2001_%yy%%mm%%dd%.txt goto :EOF :END echo 0件データでした。 >> E:\IFFILE\CHK\0_FILE\L2001_%yy%%mm%%dd%.txt REM ======================================================= echo %YMD%,%HHMMSS%,"サイズ検索処理終了" REM ======================================================= どうもファイルがない場合の処理記述方法と、フォルダ内すべてのファイルの連続検索がわかりません。 どうすればよいのでしょうか?

  • 【バッチファイル】for繰り返しがうまくいかない

    バッチファイルの置いてあるフォルダ内(ついでにサブフォルダ内も)の 特定の拡張子(今回は.txt)ファイル全てを対象に (1)ある行ある列n文字目から2文字を読み込む×2 (2)読み込んだ文字をそのファイル名の先頭に追加 というバッチファイルを作りたいです。 具体例 テキストの中身↓ a.txt ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○xx ○○yy ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... →ファイル名を「xxyya.txt」にしたい そこで素人ながら下記のようなバッチファイルを作成してみましたが、 フォルダ内にある1つ目のファイルに対してはうまく動くのですが 2つ目以降はリネーム出来ません。 フォルダ内すべての.txtファイルに実行するための 対処法がお分かりになれば、ご教授いただけると幸いです。 「rename.bat」 cd /d %~dp0 rem .txtファイルを列挙 for /f "usebackq tokens=*" %%i in (`dir /s /b *.txt`) do ( set name=%%~xni rem 特定の行列の文字列を抜き出して変数へ格納 for /f "skip=5 tokens=2,3" %%a in (%%i) do ( set front=%%a set back=%%b rem 7行目以降は不要なのでforから離脱 goto break ) :break rem 抜き出した文字列からさらに必要な文字を抜き出して変数へ set hed="%front:~2,2%%back:~2,2%" rem 元のファイル名へ追記 ren %name% %hed%%name% )

  • リンクをクリックで複数のテキストボックスに文字入力

    リンクをクリックすると、リンク先のページの複数のテキストに値が入るようなしくみがないか探しています。日付を例として、別にあるカレンダーから日付をクリックすると、リンク先ページ(hiduke.html)が開き、カレンダーから出力された yy、mm、dd が、hiduke.htmlのyy、mm、dd に自動で入力されると言う具合です。 カレンダーからの日付の入ったリンク(a href="hiduke.html?yy=2017&mm=3&dd=2”)の出力まではできたのですが、hiduke.htmlのページは開けても、 yy、mm、ddのそれぞれのテキストボックスに日付を自動記入ができません。 できれば、その部分(機能)だけのサンプルプログラムがあると助かります。 受け側はhtmlではなく、cgi(例:hiduke.cgi)でも結構です。 よろしくお願い致します。

  • 実行時引数からの日付取得

    Perl実行時に引数(YYYYMMDD)をわたして、 それをもとに処理を続けたいと考えています。 ($yy1,$mm1,$dd1) = ($ARGV[0] =~ /^(\d{4})(\d{2}-1)(\d{2})$/); $mytime=timelocal(0,0,00,$dd1,$mm1,$yy1); このように記述して20081230を引数にして実行しても 日付DDの部分がうまく入らずエラーになってしまいます。 なぜなのでしょうか。

    • ベストアンサー
    • Perl
  • バッチファイル DOS Windows2000環境での日付取得

    バッチファイル DOS Windows2000環境での日付取得 いつもお世話になります。 Windows2000環境にて当日日付を取得する下記のバッチファイルがあります。 ~コード開始~ REM 日付取得 FOR /F "tokens=1 delims= " %%i in ('DATE /t') do SET TEST1=%%i ECHO %TEST1% ~コード終了~ 上記プログラム結果は【YYYY/MM/DD】となります。 ※YYYY:当年 MM:当月 DD:当日 上記コードはWindows2000環境のDOSプロンプトにて【DATE /t】コマンドを実行すると 【YYYY/MM/DD 曜日】が表示されるのを利用しております。 結果的にスペース区切りで1節目の【YYYY/MM/DD】だけを抜き取っております。 これは問題ありませんでした。 しかし、下記コードで実行した所、意図した結果と異なるものになりました。 ~コード開始~ REM 日付取得 FOR /F "tokens=2 delims= " %%i in ('ECHO %DATE%') do SET TEST1=%%i ECHO %TEST1% ~コード終了~ 上記プログラム結果は【YYYY/MM/】となってしまい、【DD】が抜けておりました。 ※YYYY:当年 MM:当月 DD:当日 上記コードはWindows2000環境のDOSプロンプトにて【DATE】コマンドを実行すると 【曜日 YYYY/MM/DD】が表示されるのを利用しております。 結果的にスペース区切りで2節目の【YYYY/MM/DD】だけを抜き取る予定でしたが 見ての通り予想外の結果です。 この現象はなぜでしょうか? 何が起因して【DD】が表示されないのでしょうか? 他に当日日付の取得方法はいくつか知っていますが、 上記プログラムで取得したいのです。 どなたかご存知の方がいらっしゃればご教授願いませんでしょうか? 以上、何卒宜しくお願い致します。

専門家に質問してみよう