プロが教えるわが家の防犯対策術!

初めまして。よろしくお願いします。
コマンド初心者 & 初書き込みタケブーです。

早速ですが、バッチ作成についての質問です。

"D:\temp\"に下記のようなファイルが毎日100件程度出力されます。

「AAA_20090430121212.log」
「BBB_20090430121212.log」
「CCC_20090430121212.log」
「AAA_20090430131212.log」
「BBB_20090430131212.log」
「CCC_20090430131212.log」


「○○○_YYYYMMDDHHMISS.log」


「AAA_20090701122212.log」
「BBB_20090701122212.log」
「CCC_20090701122212.log」

このファイルを対象月の"D:\temp\YYYYMM"フォルダに移動し、
さらに対象日の"D:\temp\YYYYMM\YYYYMMDD"フォルダに移動したいと
考えております。

未来の月日のフォルダは作成したくありません。
そのため、ファイル名を参照し、
フォルダを作成するようにしたいのです。
また、当日分のファイルは移動対象とはしたくありません。

if文、for文を使用して何とかしようとしたのですが
うまくいきません。

ご指導のほどよろしくお願いします。

A 回答 (2件)

かなり適当ですが、たとえば以下などの内容で可能かもしれません。



@ECHO OFF
SET DNAME=D:\temp
FOR /F "tokens=1-4" %%A IN ('DIR %DNAME%') DO CALL :SUB %%D
GOTO :EOF
:SUB
IF NOT "%~x1" == ".log" EXIT /B
SET FNAME=%1
ECHO %FNAME:~4,8% %DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
IF "%FNAME:~4,8%" == "%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%" EXIT /B
IF NOT EXIST %DNAME%\%FNAME:~4,6% MD %DNAME%\%FNAME:~4,6%
IF NOT EXIST %DNAME%\%FNAME:~4,6%\%FNAME:~4,8% MD %DNAME%\%FNAME:~4,6%\%FNAME:~4,8%
MOVE %DNAME%\%FNAME% %DNAME%\%FNAME:~4,6%\%FNAME:~4,8%\
EXIT /B

この回答への補足

この度はご回答のほど、本当にありがとうございました。
他の方のバッチ内容のほうが私にはわかりやすかったので、そちらで解決できました。
時間がある時には是非こちらのバッチ内容を参考に、試してみますね。

補足日時:2009/07/04 16:00
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

FOR /F "tokens=1-4" %%A IN ('DIR %DNAME%') DO CALL :SUB %%D
やはり私自身の「for」文のオプションの勉強不足ですね。ちょっと難しいです。
また、
IF NOT "%~x1" == ".log" EXIT /B
の"%~x1"この部分とかがわからないです。
でも会社の環境で同じようなものを見た覚えがあるので、見直してきます。

ありがとうございました。週末にちゃんと勉強して、ご報告します。

お礼日時:2009/07/02 22:16

何がどううまく行かないのかを書いてくれないと。



想像するに、Unix/Linuxのシェルスクリプトのように1ファイルでどうにかする事にこだわっているのではないでしょうか?
(相当習熟している人なら書けるかも、ですが)

1ファイルにこだわらないのであれば、mainとsubでバッチを2本作ってはどうでしょう?

◆mkdir_move_sub.bat
引数のファイル名を元にフォルダ作成&移動

◆mkdir_move_main.bat
for文でdirの内容をサブに渡してやる

mkdir_move_sub.batの内容(ここから)
REM --------------------------------
@echo off

d:
cd d:\temp

REM 引数1の内容をセット
set filename=%~1

REM 引数の内容から年月を取得
set YYYYMM=%filename:~4,6%

REM 引数の内容から年月日を取得
set YYYYMMDD=%filename:~4,8%

REM 今日の日付を取得(書式は環境依存なので注意!)
set TODAY=%DATE:/=%

REM 日付が今日だったらフォルダ作成せず終了
if "%YYYYMMDD%" == "%TODAY%" goto endbatch

REM フォルダが存在しない場合は作成
if not exist "%YYYYMM%" mkdir "%YYYYMM%"
if not exist "%YYYYMM%\%YYYYMMDD%" mkdir "%YYYYMM%\%YYYYMMDD%"

REM ファイルを移動
move "%filename%" "%YYYYMM%\%YYYYMMDD%"

:endbatch
REM --------------------------------
mkdir_move_sub.batの内容(ここまで)

mkdir_move_main.batの内容(ここから)
REM --------------------------------
@echo off

d:
cd d:\temp

REM 今日の日付を除いたファイルから年月フォルダ作成し移動
FOR /F "usebackq delims==" %%i IN (`dir /b *.log`) DO @call mkdir_move_sub.bat %%i

REM --------------------------------
mkdir_move_main.batの内容(ここまで)

この回答への補足

ご回答いただいた内容を参考にして、無事解決できました。
ただ、ファイルの名前が、
「A_20090430121212.log」
「BB_20090430121212.log」
「CCC_20090430121212.log」
のように文字数に違いがあったので、新たに「IF」文を使って場合分けしました。
本当にありがとうございました。

補足日時:2009/07/04 15:54
    • good
    • 0
この回答へのお礼

ご回答のほど、ありがとうございます。
FOR /F "usebackq delims==" %%i IN (`dir /b *.log`) DO @call mkdir_move_sub.bat %%i
の部分でファイルが開けませんとなってしまいました。
また、「"usebackq delims"」 の意味、「IN (`dir /b *.log`)」の``など少々わからない部分がありました。

やはり、勉強不足です。

でも、考え方はわかったので、とても参考になりました。

もうちょっと考えてみて、週末にはまた結果をご報告します。

お礼日時:2009/07/02 22:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!