- ベストアンサー
ファイル削除対象を最終保存日時で判別するフリーウェア
自動でファイル削除するフリーウェアを探しています。 拡張子で判別するものは多くありますが、最終保存日時で判別するものはありませんでしょうか? 対象フォルダを指定した上で、1ヶ月以上変更されていないものは削除(あるいはゴミ箱に移動)したいのです。 フリーウェアではありませんが「RDel」は試してみましたが、他にも同様の機能のフリーウェアを御存知ないで しょうか? お勧めのアプリがあれば、御推薦お願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
いや、それほどすごい内容じゃないです…。 WSHというプログラムに慣れるための練習に 自己満で書いてるだけなんでお気になさらず。 #3で2つバグがあったんで治しておきました。 1.「ファイルの削除の確認」画面が消えないことがある。 2.削除の確認メッセージを表示しない設定のときに ちゃんとごみ箱に移動できない。 スタートアップに登録するときは、 もちろんバッチファイルを作ってもいいですが、 一度~\CScript.exeのショートカットを作ってから そのショートカットのプロパティ→ショートカット の「リンク先」に追加記述しても可能です。 //----------------------------- ここから var FSO = WScript.CreateObject("Scripting.FileSystemObject"); var WshShell = WScript.CreateObject("WScript.Shell"); var Shell = WScript.CreateObject("Shell.Application"); var oArgs = WScript.Arguments; var nMode,nTimeBack,strFolder; var oNow = new Date(); var nNowYear = oNow.getFullYear(); var nNowMonth = oNow.getMonth()+1; var nNowDay = oNow.getDate(); oNow = new Date(nNowYear,nNowMonth-1,nNowDay); oPrevDate = null; var strTitle = "古いファイルをゴミ箱に入れるプログラム"; function help(){ WshShell.Popup( " [使い方]\n" + " コマンドラインから実行します。\n" + " C:\\Temp\\内において、最近1ヶ月更新がないファイルをゴミ箱に入れるときは\n\n" + " " + FSO.GetSpecialFolder(1) +"\\CScript.exe \"" + WScript.ScriptFullName + "\" -m 1 \"C:\\Temp\\\" \n\n" + " のように記述します。\n" + " タスクに登録するときは、上のまま最後のフォルダ名だけ変えればOK。\n\n" + " [オプション]\n" + " -y n\t\t更新がn年前より古いファイルをゴミ箱に入れます。\n" + " -m n\t\t更新がnヶ月前より古いファイルをゴミ箱に入れます。\n" + " -d n\t\t更新がn日前より古いファイルをゴミ箱に入れます。\n\n" + " [補足]\n" + " ・オプションは一個だけにしてください。\n\n" + " (C) 2004 komugi100g" , 120, strTitle, 0 + 64); WScript.Quit(0); } function throwTrash(strSubFolder){ var oFolder = Shell.NameSpace(strSubFolder); var TargetFolder = FSO.GetFolder(strSubFolder); var TargetFolderFiles = new Enumerator(TargetFolder.files); var TargetFolderSubFolders = new Enumerator(TargetFolder.SubFolders); for(; ! TargetFolderFiles.atEnd(); TargetFolderFiles.moveNext()){ var oFile = FSO.GetFile(TargetFolderFiles.item()); var oFileDate = oFile.DateLastModified; var flag; switch(nMode){ case 0: flag = (oPrevDate - oFileDate)>0?1:0; break; case 1: flag = (oPrevDate - oFileDate)>0?1:0; break; case 2: flag = parseInt((oNow - oFileDate)/(24*60*60*1000))>nTimeBack?1:0; break; default: flag = 0; } if(flag==1){ var oFolderItem = oFolder.ParseName(FSO.GetFileName(TargetFolderFiles.item())); oFolderItem.InvokeVerb("削除(&D)"); } } for(; ! TargetFolderSubFolders.atEnd(); TargetFolderSubFolders.moveNext()){ throwTrash(TargetFolderSubFolders.item()); } } try{ if(oArgs(0).charAt(0)=='-'){ switch(oArgs(0).charAt(1).toUpperCase()){ case 'Y': nMode = 0; break; case 'M': nMode = 1; break; case 'D': nMode = 2; break; case 'R': while(true){ if(WshShell.AppActivate("ファイルの削除の確認")){ WshShell.SendKeys("y"); } WScript.Sleep(100); } WScript.Quit(0); default: throw new Exception(); } }else{ throw new Exception() } if(! isNaN(oArgs(1))) nTimeBack = oArgs(1); else throw new Exception(); strFolder = oArgs(2); if(nMode==0) oPrevDate = new Date(nNowYear-nTimeBack,nNowMonth-1,nNowDay); else if(nMode==1) oPrevDate = new Date(nNowYear-parseInt((nTimeBack-nNowMonth+12)/12),nNowMonth-nTimeBack+parseInt((nTimeBack-nNowMonth+12)/12)*12-1,nNowDay); }catch(e){ help(); } if(FSO.FolderExists(strFolder)){ var oExec = WshShell.Exec("CScript \"" + WScript.ScriptFullName + "\" -r"); throwTrash(FSO.GetAbsolutePathName(strFolder)); oExec.Terminate(); }else{ WshShell.Popup("指定されたフォルダが存在しません。",20,strTitle,0+48); } //----------------------------- ここまで
その他の回答 (4)
- komugi100g
- ベストアンサー率58% (108/186)
35行目あたり var oFolder = Shell.NameSpace(strSubFolder); は var oFolder = Shell.NameSpace(strSubFolder+"\\"); と「+"\\"」が必要でした。 失礼。
- komugi100g
- ベストアンサー率58% (108/186)
作ってみたので、もしよかったら使ってみてください。 一応これだといきなり削除!じゃなくて、ごみ箱へ移動するだけです。 下の「ここから」から「ここまで」をノートパッドにコピー&ペーストして、 「名前をつけて保存」でファイルの種類を「すべてのファイル」、 ファイル名を「~.js」にして保存すると(~はなんでもいい) 黄色い巻物みたいなアイコンのファイルができると思います。 これをダブルクリックすると使い方の説明ウィンドウが出てきます。 どこの馬の骨とも知れぬ者が書いたプログラムなので 変なコードが仕組まれてないかどうか怖いかとも思いますが、そのときは コンピューター [技術者向け] > プログラミング > JavaScript で「これ大丈夫ですか?」と聞いてみてください。 //----------------------------- ここから var FSO = WScript.CreateObject("Scripting.FileSystemObject"); var WshShell = WScript.CreateObject("WScript.Shell"); var Shell = WScript.CreateObject("Shell.Application"); var oArgs = WScript.Arguments; var nMode,nTimeBack,strFolder; var oTrash = Shell.Namespace(10); var oNow = new Date(); var nNowYear = oNow.getFullYear(); var nNowMonth = oNow.getMonth()+1; var nNowDay = oNow.getDate(); oNow = new Date(nNowYear,nNowMonth-1,nNowDay); oPrevDate = null; var strTitle = "古いファイルをゴミ箱に入れるプログラム"; function help(){ WshShell.Popup( " [使い方]\n" + " コマンドラインから実行します。\n" + " C:\\Temp\\内において、最近1ヶ月更新がないファイルをゴミ箱に入れるときは\n\n" + " " + FSO.GetSpecialFolder(1) +"\\CScript.exe \"" + WScript.ScriptFullName + "\" -m 1 \"C:\\Temp\\\" \n\n" + " のように記述します。\n" + " タスクに登録するときは、上のまま最後のフォルダ名だけ変えればOK。\n" + " コマンドプロンプトでも上のまま打って実行可能です。\n" + " タスクに登録する前に、コマンドプロンプトに打ってテストしてください。\n\n" + " [オプション]\n" + " -y n\t\t更新がn年前より古いファイルをゴミ箱に入れます。\n" + " -m n\t\t更新がnヶ月前より古いファイルをゴミ箱に入れます。\n" + " -d n\t\t更新がn日前より古いファイルをゴミ箱に入れます。\n\n" + " [補足]\n" + " オプションは一個だけにしてください。\n\n" + " (C) 2004 komugi100g" , 160, strTitle, 0 + 64); WScript.Quit(0); } function throwTrash(strSubFolder){ var oFolder = Shell.NameSpace(strSubFolder); var TargetFolder = FSO.GetFolder(strSubFolder); var TargetFolderFiles = new Enumerator(TargetFolder.files); var TargetFolderSubFolders = new Enumerator(TargetFolder.SubFolders); for(; ! TargetFolderFiles.atEnd(); TargetFolderFiles.moveNext()){ var oFile = FSO.GetFile(TargetFolderFiles.item()); var oFileDate = oFile.DateLastModified; var flag; switch(nMode){ case 0: flag = (oPrevDate - oFileDate)>0?1:0; break; case 1: flag = (oPrevDate - oFileDate)>0?1:0; break; case 2: flag = parseInt((oNow - oFileDate)/(24*60*60*1000))>nTimeBack?1:0; break; default: flag = 0; } if(flag==1){ var oFolderItem = oFolder.ParseName(FSO.GetFileName(TargetFolderFiles.item())); var oExec = WshShell.Exec("CScript \"" + WScript.ScriptFullName + "\" -r"); oFolderItem.InvokeVerb("削除(&D)"); for(j=0;j<100;j++){ if(oExec.Status==1) break; WScript.Sleep(200); } oExec.Terminate(); } } for(; ! TargetFolderSubFolders.atEnd(); TargetFolderSubFolders.moveNext()){ throwTrash(TargetFolderSubFolders.item()); } } try{ if(oArgs(0).charAt(0)=='-'){ switch(oArgs(0).charAt(1).toUpperCase()){ case 'Y': nMode = 0; break; case 'M': nMode = 1; break; case 'D': nMode = 2; break; case 'R': for(i=0;i<100;i++){ if(WshShell.AppActivate("ファイルの削除の確認")){ WshShell.SendKeys("y"); break; } WScript.Sleep(200); } WScript.Quit(0); default: throw new Exception(); } }else{ throw new Exception() } if(! isNaN(oArgs(1))) nTimeBack = oArgs(1); else throw new Exception(); strFolder = oArgs(2); if(nMode==0) oPrevDate = new Date(nNowYear-nTimeBack,nNowMonth-1,nNowDay); else if(nMode==1) oPrevDate = new Date(nNowYear-parseInt((nTimeBack-nNowMonth+12)/12),nNowMonth-nTimeBack+parseInt((nTimeBack-nNowMonth+12)/12)*12-1,nNowDay); }catch(e){ help(); } if(FSO.FolderExists(strFolder)){ throwTrash(FSO.GetAbsolutePathName(strFolder)); }else{ WshShell.Popup("指定されたフォルダが存在しません。",20,strTitle,0+48); } //----------------------------- ここまで
- piyo-kichi
- ベストアンサー率47% (9/19)
これはどうでしょう。 タスクスケジューラで定期的に実行すればお望みの動作になります。
お礼
御回答有難うございます。なかなか使えそうなソフトですね。 早速使ってみて、周りの評判がよければ採用したいと思います。 また分からないことがあったら、よろしくお願いします。
- komugi100g
- ベストアンサー率58% (108/186)
エクスプローラの検索機能で更新日時の範囲を 20年くらい前から1ヶ月前の日時までに指定して 検索にひっかかったファイルをまとめてゴミ箱に 入れる方法では不都合ですか?
お礼
回答有難うございます。 良案が見つからなかった時の手段として考慮しようと思います。
補足
御提案の方法だと、削除しようとする意思が必要ですよね。 それを忘れてしまうので「自動的に」(タスク的に)削除してくれるツールが欲しいのです。 Windows起動時に、毎回チェックしてくれるような.... そういう手段を探しています。
お礼
御回答有難うございます。というか... なんか、すごいモノを書いていただいているようで、恐縮の限りです。 起動時に自動的に実行するには、コマンド行を書き込んだバッチファイルを作成して、スタートアップから起動させればいいのでしょうか? バッチファイル... 個人的には問題ないつもりなのですが、周りの声が気になるところです。 ともあれ、こんな質問の回答をソースコードで教えていただき、有難うございました。