推しミネラルウォーターはありますか?

コマンドプロンプト初心者です。

毎月1日にタスクに設定したバッチを実行して、
フォルダの新規作成と古いフォルダの削除をしたいのですが、
処理をどのように考えたら良いか分かりません。

あるフォルダに
2011年7月,2011年8月,2011年9月という処理の対象のフォルダと
その他にいくつかフォルダがあります。

処理の内容としては、
10月1日になったら「2011年10月」というフォルダを作成し
3ヵ月前に作成された「2011年7月」フォルダを削除

いろいろ調べているのですが、
コマンドプロンプトだけで出来るのかどうかも分かりません。
どなたかアドバイスお願いします。

A 回答 (4件)

No.2です。


100の意味ですが、年月(ym)をYYYYMMの6桁の数値にしています。例えば2011年7月なら ymには201107が入っています。

set /a yyyy=ym/100 ← 201107÷100=2011(ただし小数切り捨て)
set /a mm=ym%%100 ← 201107 mod 100=7(剰余;100で割ったあまり)

なぜこのようにするかというと、08とか09がset /aでエラーとなる事を回避するためです。(set /? のヘルプをご確認下さい)

つぎにloopのところですが、解説しようとして間違いに気づきました。
3月に実行すると0月となってしまいます。

わかりにくい所もあるので、バッチを以下のように訂正します。
これで説明した通りの式になっていると思います。

echo off
for /f "tokens=1-3 delims=/" %%d in ('date /t') do set ym=%%d%%e

:現在のフォルダ名
set /a yyyy=ym/100
set /a mm=ym%%100
set newf=%yyyy%年%mm%月

:3ヶ月前を求める
set /a mm = mm - 3

:0以下になるときは年/月を調整する
if %mm% LEQ 0 set /a mm = mm + 12 & set /a yyyy=yyyy-1

:3ヶ月前のフォルダ名
set oldf=%yyyy%年%mm%月

:フォルダ作成
if not exist "%newf%" md "%newf%"

:フォルダ削除
rd /s "%oldf%"
    • good
    • 0
この回答へのお礼

> set /a yyyy=ym/100 ← 201107÷100=2011(ただし小数切り捨て)
> set /a mm=ym%%100 ← 201107 mod 100=7(剰余;100で割ったあまり)

商が2種類あることを知りませんでした…
サンプル修正と解説ありがとうございました。
理解できました!

お礼日時:2011/07/28 15:25

VBScript です。



Const rootDir = "d:\test\"

Dim fso
Set fso = CreateObject("Scripting.FileSystemobject")

If Not fso.FolderExists(rootDir) Then
WScript.Quit
End If

Dim delTargetPath
delTargetPath = fso.BuildPath(rootDir, Year(DateAdd("m", -3, Now)) & "年" & Right("00" & Month(DateAdd("m", -3, Now)), 2) & "月")

Dim newTargetPath
newTargetPath = fso.BuildPath(rootDir, Year(Now) & "年" & Right("00" & Month(Now), 2) & "月")

If fso.FolderExists(delTargetPath) Then
fso.DeleteFolder(delTargetPath)
End If

If not fso.FolderExists(newTargetPath) Then
fso.CreateFolder(newTargetPath)
End If
    • good
    • 0
この回答へのお礼

VBScriptで書くと、こうなるのですね。
勉強になります。
今回はコマンドで出来そうなので、機会があれば挑戦したいと思います。
ありがとうございました。

お礼日時:2011/07/27 16:42

こんにちは。

No.1で紹介されたリンク先のページの制作者です。

年月日まで絡むとリンク先のように月末処理で複雑な計算になりますが、
単に3ヶ月前の年月のみ計算するのはリンク先ほど複雑ではありません。

月から3をひいて、0以下にならなければそのまま。
0以下になったら12を足して、年を1ひくだけです。

稼働時の年月を取り出すには%date%を使うか date /t の出力を使います。
以下はサンプルです。

echo off
for /f "tokens=1-3 delims=/" %%d in ('date /t') do set ym=%%d%%e

:現在のフォルダ名
set /a yyyy=ym/100
set /a mm=ym%%100
set newf=%yyyy%年%mm%月

:3ヶ月前を求める
set /a ym=ym-3

:loop
set /a yyyy=ym/100
set /a mm=ym%%100
if %mm% GTR 12 set /a ym=ym -100 + 12&goto :loop

:3ヶ月前のフォルダ名
set oldf=%yyyy%年%mm%月

:フォルダ作成
if not exist "%newf%" md "%newf%"

:フォルダ削除
rd /s "%oldf%"
    • good
    • 0
この回答へのお礼

リンク先より簡単な計算で良いのですね。
コメント付きの分かりやすいサンプル、ありがとうございます!
変数の値を確認しました。すごいです…

サンプルについて質問なのですが、

:現在のフォルダ名 の計算の、100はどういう値なのでしょうか?

set /a yyyy=ym/100
set /a mm=ym%%100

:loop について。下の処理の部分だと思うのですが、
set /a ym=ym -100 + 12&goto :loop の意味が分かりませんでした。

月から3をひいて、0以下にならなければそのまま。
0以下になったら12を足して、年を1ひくだけです。

if %mm% GTR 12 set /a ym=ym -100 + 12&goto :loop

ご教示頂けないでしょうか?
よろしくお願いいたします。

お礼日時:2011/07/27 11:33

たぶん可能だと思います。


たとえば、10月1日になったら「2011年10月」というフォルダを作成というのは、以下のような処理で可能です(10月1日になったらというより、とにかくなければ作るという考えで)。

SET FOLDER="C:\TEST"
SET YYYYMM=%DATE:~0,4%年%DATE:~5,2%月
IF NOT EXIST %FOLDER%\%YYYYMM% MKDIR %FOLDER%\%YYYYMM%


3ヵ月前に作成された「2011年7月」フォルダを削除というのも同様に、「2011年7月」フォルダが存在していれば削除でよさそうです。
ただし、以下などを参考に3ヵ月前の日付を計算する必要があるのと、「2011年7月」だとやりにくいので「2011年07月」というよに桁数は揃えたほうがいいと思います。

http://homepage1.nifty.com/jak/batch/date.html


※当然VBScriptなどのほうが簡単だとは思いますが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
考え方としては「無ければ作る」なのですね。
フォルダ作成の方は、おかげさまで出来ました!

フォルダの削除については、URLを参考に頑張ってみます。
VBScriptのほうが簡単なんですね…

お礼日時:2011/07/26 16:03

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