- ベストアンサー
バッチ作成についての質問
- 大学生がバッチ作成についての質問をしています。課題の内容や必要な機能について説明し、バッチ作成のイメージがわかりにくいことを伝えています。
- 質問者は、情報系の講義の課題でバッチ作成が必要とされています。具体的には、A~Cの各店舗のフォルダから1か月より前のファイルを自動的に削除するバッチを作成する必要があります。
- バッチ作成は初めての経験であり、イメージがわかりにくいため、バッチ作成に関するアドバイスや手順などを求めています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
回答1の補足へのアドバイスです。 課題の期限もあるのでしょうが、何を始めるにせよドキュメントを読まねばならないでしょう。 WSHでしたらMicrosoft MSDNの、Windows Script Host, JScript, FileSystemObjectあたりをざっと眺めるとよいです。 Microsoft Windows スクリプト テクノロジ http://msdn.microsoft.com/ja-jp/library/cc392483.aspx インターネットでもいろいろなサンプルを検索できます。MSのドキュメントよりもわかりやすいかもしれません。また回答1のサンプルはJScriptで書きましたが、Visual Basic風なVBScriptも選べます。検索できるサンプルはVBSciptが多いようです。 とりあえずドキュメントは一通り眺めたとしまして、スクリプトは自分の手元で手軽に試せるのが利点ですから、まず、テストをするために「A店舗フォルダ」を作ってはどうでしょうか。任意の日付のファイルを作成するのは、たぶん難しいと思いますのでPCの中から適当な日付のファイルをいくつかコピーしては。 そうしたら課題に向けて少しずつスクリプトを組み立ててテストします。たぶん1発では動かないでしょうから、直してテスト、を繰り返します。 例えば最初はA店舗フォルダ内のファイルをリストします。これは回答1のサンプルそのものですね。とりあえずサンプルの★指定フォルダをA店舗フォルダに書き換えればよいでしょう。 次に1ヶ月以上前のファイルをリストします。これはログファイルの一部に相当します。実現するには1ヶ月前の日付とファイルの作成日をif文で比較すればいいですね。どちらの日付も回答1のサンプルにあります。if文は調べて下さい。 ここまでできたら、対象のファイルの削除を加えれば主なところは完成です。なお、回答1のサンプルにはファイル削除がありませんでした。ファイルを削除するにはFileSystemObjectのメソッドを使います。リストするファイルだけを削除し、別のファイルを消さないように注意して下さい。 ----- 以上で主なところは完成ですが、B店舗フォルダ、C店舗フォルダに適用する、ログに削除した日付を残す、ログファイル名を作る(フォルダ名との規則性は?)等が残っていますね。どうしたらよいか考えてみましょう。
その他の回答 (1)
- SHIMAPEE
- ベストアンサー率75% (154/203)
batファイルだと1ヶ月前の日付を求める処理が面倒なのではないでしょうか。その点、Windows Script Host(WSH)のスクリプトなら簡単です。 例えば下の6行をコピーしてDate.jsなどの名前を付けて保存し、ダブルクリックで実行すると1ヶ月前の日時が表示されます。なお10/31の1ヵ月前はどうするか…、このスクリプトだとどうなるか…、は試してみて下さい。 ----- // 1ヶ月前の日時を表示するJScript dt = new Date(); //dt = new Date("2009/10/31"); //WScript.Echo ("基準の日時: "+ dt); dt.setMonth(dt.getMonth() - 1); WScript.Echo ("1ヶ月前の日時: "+ dt); ----- 「WSH」で検索するとサンプルはいろいろ出てきますが、今回の課題に役立ちそうな部品を二つ書きます。これで課題解決の要素は全て含んでいると思います。 例えばログファイルの名前は、固定の文字列と今日のYYYYMMDD文字列と".log"の連結で生成すればよいです。 Windows XP Pro SP3とVista Ultimate SP2で試しましたがWindows98以降なら動くと思います。 ----- // 指定フォルダ内のファイルをリストするJScript var Folder = "C:\\"; //★指定フォルダ var Output = "C:\\test\\FileList.log"; //★リストファイル。\testは作っておく var Fs, Ctr, Tx, fo, fic, fin; Fs = WScript.CreateObject("Scripting.FileSystemObject"); Ctr = 0; Tx = Fs.OpenTextFile(Output, 2, true); // 上書き fo = Fs.GetFolder(Folder); fic = new Enumerator(fo.files); for (; !fic.atEnd(); fic.moveNext()){ Ctr++; fin = fic.item(); Tx.Writeline("\"" + fin + "\""); // ファイル名を書き込む } Tx.Close(); WScript.Echo(Ctr+"ファイルをリストしました。"); ----- ----- // ファイルの作成日を表示するJScript Fs = WScript.CreateObject("Scripting.FileSystemObject"); f = Fs.GetFile("C:\\AUTOEXEC.BAT"); //★ファイル名 dt = new Date(f.DateCreated); WScript.Echo ("作成日: " + GetYMDstr(dt)); // DateオブジェクトからYYYYMMDD文字列を求める関数 function GetYMDstr(d){ var month, day; month = (d.getMonth()+1).toString(10); if (month.length==1) month="0"+month; day = d.getDate().toString(10); if (day.length==1) day="0"+day; return(d.getFullYear().toString(10) + month + day); } -----
補足
丁寧なアドバイス、ご回答ありがとうございます。恥ずかしながら、 WSHという技術があるのをSHIMAPEEさんに教えていただくまで 私は存じておりませんでした。ネットで調べてみてDosバッチよりも 柔軟度の高い機能を備えていることで、自分の勉強の為にも こちらの教えていただいたWSHで今回の課題のバッチ作成を行って みようと思います。 課題解決の方法を示していただいた上で、恐縮なのですが、 SHIMAPEEさんがあげてくださった4つのスクリプトで ご教示いただきたい部分があります。 (1)1ヶ月前の日時を表示するJScript (2) 指定フォルダ内のファイルをリストするJScript (3) ファイルの作成日を表示するJScript (4)DateオブジェクトからYYYYMMDD文字列を求める関数 の(1)~(4)が、今回の課題の主な前提である A.それぞれの各フォルダ内のファイルがなくなるまで検索する B.1か月以上前のファイルであるかどうか条件分岐する C.1か月以上前のファイルであれば、削除する D.消したファイルの名前と削除した日付をログにを残す A~Dのどれに該当するか教えていただけますでしょうか。 不勉強でお恥ずかしい限りですが、よろしくお願いします。
補足
重ね重ねご親切なアドバイスありがとうございます。 自分でもWSHのドキュメントを読みつつ、これまでに示して いただいたサンプルを参考にさせていただき、作成を進めて いきたいと思います。 まずは、SHIMAPEEさんのおっしゃるようにA店舗から主なところを 作成していき、B店舗フォルダ、C店舗フォルダに適用する、ログに削除した日付を残す、ログファイル名を作るといった残りの部分に及んでいければと思います。 課題の期限は来週水曜日の午前までですが、何とか頑張って 今週中には主な部分は作りあげたいと思います。 作成に行き詰るとまたご質問させていただくかも知れませんが、 お時間がお有りでいらっしゃるときにまたアドバイスいただけたらと存じます。厚かましいお願いで申し訳ありませんが、よろしくお願いいたします。