- ベストアンサー
コマンドプロンプトでのフォルダ操作(作成・削除)
コマンドプロンプト初心者です。 毎月1日にタスクに設定したバッチを実行して、 フォルダの新規作成と古いフォルダの削除をしたいのですが、 処理をどのように考えたら良いか分かりません。 あるフォルダに 2011年7月,2011年8月,2011年9月という処理の対象のフォルダと その他にいくつかフォルダがあります。 処理の内容としては、 10月1日になったら「2011年10月」というフォルダを作成し 3ヵ月前に作成された「2011年7月」フォルダを削除 いろいろ調べているのですが、 コマンドプロンプトだけで出来るのかどうかも分かりません。 どなたかアドバイスお願いします。
- みんなの回答 (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%"
その他の回答 (3)
- temtecomai2
- ベストアンサー率61% (656/1071)
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
お礼
VBScriptで書くと、こうなるのですね。 勉強になります。 今回はコマンドで出来そうなので、機会があれば挑戦したいと思います。 ありがとうございました。
- pita-gora
- ベストアンサー率70% (102/145)
こんにちは。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%"
お礼
リンク先より簡単な計算で良いのですね。 コメント付きの分かりやすいサンプル、ありがとうございます! 変数の値を確認しました。すごいです… サンプルについて質問なのですが、 :現在のフォルダ名 の計算の、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 ご教示頂けないでしょうか? よろしくお願いいたします。
- OMEGAT
- ベストアンサー率70% (455/642)
たぶん可能だと思います。 たとえば、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などのほうが簡単だとは思いますが。
お礼
回答ありがとうございます。 考え方としては「無ければ作る」なのですね。 フォルダ作成の方は、おかげさまで出来ました! フォルダの削除については、URLを参考に頑張ってみます。 VBScriptのほうが簡単なんですね…
お礼
> set /a yyyy=ym/100 ← 201107÷100=2011(ただし小数切り捨て) > set /a mm=ym%%100 ← 201107 mod 100=7(剰余;100で割ったあまり) 商が2種類あることを知りませんでした… サンプル修正と解説ありがとうございました。 理解できました!