読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

Windowsで,簡単にファイルを「ごみ箱」に送るバッチのサンプルコード。削除処理に「シェル名前空間」を使う仕組みの解説

windows プログラミング WSH/JScript


Windowsで,ファイルをゴミ箱の中に移動するWSHバッチ。

完全に削除せず,ごみ箱に送るだけなので,安心して実行できる。


gomi1.js(ごみ箱に送る際に確認なし。ダブルクリックするだけ)

// 削除したいファイル
var file_path = "C:\\temp\\hoge.txt";

// ゴミ箱に移動するのではなく,直接削除する
//WScript.CreateObject("Scripting.FileSystemObject").DeleteFile( file_path );

// ファイルをゴミ箱に送る。
// シェル名前空間でゴミ箱を指定してMoveHereする
var sh = WScript.CreateObject("Shell.Application");
var ssfBITBUCKET = 10;
sh.NameSpace(ssfBITBUCKET).MoveHere(file_path);

// 削除完了まで待つ(MoveHereは非同期なので)
var fso = WScript.CreateObject("Scripting.FileSystemObject");
while( fso.FileExists( file_path ) ){
	WScript.Sleep(100);
}

WScript.Echo("削除しました。");


gomi2.js(ごみ箱に送ってよいですか?という確認ダイアログ付き。ダブルクリックするだけ)

// 削除したいファイル
var file_path = "C:\\temp\\hoge.txt";

// 親フォルダのパスを算出する
var parent_dir = file_path.replace(/\\[^\\]+$/, "\\");

// フォルダ内のファイル名を算出する
var file_name = file_path.replace(/^.+\\([^\\]+)$/, "$1");

// ファイルをゴミ箱に移動する。
// シェル名前空間で,ファイルに対してInvokeVerbする
var sh       = WScript.CreateObject("Shell.Application");
var obj_dir  = sh.Namespace( parent_dir );
var obj_file = obj_dir.ParseName( file_name );
obj_file.InvokeVerb("delete") 
	// このファイルをごみ箱に移動してもよいですか?
	// という確認ダイアログが必ず表示される。

WScript.Echo("削除しました。");

上記のサンプルコードの意味や動作原理,

また関連するWindowsの知識などを下記でくわしく解説する。



(0)要点のまとめ

ここで理解する項目のリスト:

(1)ゴミ箱の実体とSID:

  • Windowsのゴミ箱の実体=C:\$Recycle.Bin フォルダ
    • OSで保護されたファイルを,エクスプローラ上で表示する方法
    • エクスプローラからゴミ箱の実体を開く
  • ユーザのSID(Security ID)
    • whoami /user コマンドによるSIDの確認
    • ゴミ箱の中身は,SID別にサブフォルダで分割されている
  • Windowsのゴミ箱の中身を,バッチから空にする
    • rdコマンド
    • CUIでゴミ箱を空にした場合は,GUIのアイコンは再描画されない。


(2)シェル名前空間とシェルAPI・アイテムID:

  • シェル名前空間=ファイルシステムの上位概念で,デスクトップをルートとした構造
    • エクスプローラで表示される構造であり,仮想フォルダやファイルオブジェクトを取り扱える。
    • シェル名前空間の「仮想フォルダ」とは,「デスクトップ」「コントロールパネル」「ゴミ箱」など
    • シェル名前空間の「ファイルオブジェクト」とは,コントロールパネル上で表示される個別のオブジェクトなど
  • 「アイテムID」
    • シェル名前空間の中で,仮想フォルダなどの個別のオブジェクトを識別する。
    • ファイルパス文字列と異なり,一つのものしか表せない。
    • フルパスに相当するものを表すためには,複数のアイテムIDを並べた「アイテムIDリスト」を使う。
  • シェルAPI
    • シェル名前空間を操作できる。
    • SHFileOperationでゴミ箱にアクセスできる。


(3)WSHでゴミ箱にアクセス:

  • シェル名前空間で,定数を使ってゴミ箱にアクセス
    • CSIDLまたはKNOWNFOLDERIDで特殊フォルダを指定
    • MoveHereで非同期でゴミ箱に送る
    • InvokeVerbで確認つきでゴミ箱に送る
  • その他の方法でゴミ箱を指定
    • CLSIDでゴミ箱を指定する方法
    • シェルコマンドでゴミ箱を指定する方法

(1)ゴミ箱の実体とSID

(1−1)Windowsのゴミ箱の内部構造

まずWindows内部では,ドライブごとにゴミ箱が存在する。

デスクトップで見えているゴミ箱は,全ドライブのゴミ箱を集めて同時に表示したもの。

外付けHDDの「ゴミ箱を空にしますか?」問題は,巨大ファイル削除後に起こる
http://computer-technology.hateblo.jp/entry/20131112/p1

  • ドライブごとにゴミ箱がある」というWindowsの仕様を理解しておこう。
    • CドライブのファイルならCドライブのごみ箱へ,DドライブのファイルならDドライブのごみ箱へ入る。
  • つまり, ファイルがあるドライブの「ゴミ箱」に入る。
    • Cドライブ内のゴミを捨てた時にはC:\Recycledに保存される。
    • デスクトップでは,この複数ドライブ分のごみ箱の中身がぜんぶ一緒に見えている。
    • 外付けHDDの場合,対象のドライブのルートフォルダを開くと、Recycle.binとかRecyclerなどの隠しフォルダがあり,そこがそのドライブのゴミ箱。


ではCドライブの場合に,このドライブ専用のゴミ箱の
「実体」を目で見てみよう。


ゴミ箱の実体は,
C:\$Recycle.Bin というファイルパスに存在するフォルダだ。

このフォルダはOSで保護されて非表示になっているので,
フォルダオプションから「保護されたファイルを表示」すれば見られる。


そしてエクスプローラ上で,
ロケーションバーに C:\$Recycle.Bin というフォルダパスを入力すれば,
ゴミ箱の内部に移動できる。


ちなみにWindows XPでは C:\RECYCLER で,
Vista以降が C:\$Recycle.bin となっている。

Windows Vista・7でゴミ箱のフォルダへのパス・実際の場所 - MiuxMiu
http://www.miuxmiu.com/archives/2011/...

  • Windows Vista・7でゴミ箱のフォルダへのパス・実際の場所 C:\$Recycle.Bin
  • フォルダオプションで「保護されたオペレーティングシステム・ファイルを表示しない」のチェックを外す


ここで,ゴミ箱の中身を調べてみよう。


ゴミ箱の中身の実体は,
Windowsのユーザ別にフォルダが分かれている。


Windowsユーザには,
それぞれSIDという識別子が割り振られており,
ゴミ箱の中身もSIDでフォルダ分けされている。

Windows の「ごみ箱」の構造 - Programming Field
http://pf-j.sakura.ne.jp/program/tips...

  • RecycledとRecyclerはファイルシステムの違い
    • Recycled フォルダは FAT や FAT32 ファイルシステムでごみ箱を使用する設定になっているディスク上に、
    • Recycler フォルダは同様に NTFS ファイルシステムに作成される。
  • Recycler フォルダは、Recycled フォルダを拡張した構造
    • Recycler の直下には、「SID」と呼ばれるログインユーザを識別する ID の名前をしたフォルダが置かれている
    • これらは、ごみ箱のデータがユーザ間で共有されないように作られており、基本的に該当するユーザのみが使用できる
  • ごみ箱を利用するかどうかの情報や、ごみ箱の最大容量などはレジストリによって制御されている
    • その場所は HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Explorer\BitBucket


Windows Programming Tips & Memos
http://www5d.biglobe.ne.jp/~noocyte/P...

  • ごみ箱は Windows95 以降のシェルアプリケーションの機能
    • したがってごみ箱用の API は Windows API ではなく,シェル API
  • SHFileOperation()
    • ファイルまたはディレクトリをごみ箱に移動する. (ごみ箱以外の機能もあり.)
  • ごみ箱フォルダのパス名
    • 各ドライブの <drive>:\RECYCLER\<OwnerSID> (隠しフォルダ).
    • <drive> はドライブ文字 (A〜Z), <OwnerSID> はユーザの SecurityID。
    • したがって複数ユーザが使用している PC では, ドライブごと,ユーザごとにごみ箱フォルダが作られる。


自分のSIDは,コマンドプロンプトで
whoami /user
とすれば確認・表示できる。


SIDがわかれば,ゴミ箱の内部にある
カレントユーザのフォルダのパスがわかる。

whoamiコマンドでユーザーのSIDや権利を調査する − @IT
http://www.atmarkit.co.jp/fwin2k/win2...

  • 「whoami /user」とすると、ユーザー名とSIDが表示される


ゴミ箱の内部で,実際に
廃棄済みのファイルが格納されている階層まで進んでみよう。


するとそこには,INFOまたはINFO2というファイルの中に,
廃棄済みのファイルの名前一覧が管理されている。

ごみ箱がファイルを格納する方法
https://support.microsoft.com/en-us/k...

  • 各ハード ディスクには、Recycled という名前の非表示フォルダが存在します。
    • このフォルダには、Windows エクスプローラかマイ コンピュータで削除されたファイル、または Windows ベースのプログラムによって削除されたファイルが格納されます。
  • ファイルを削除すると、フルパスおよびファイル名が、Recycled フォルダの INFO または INFO2 (Windows 98 の場合) に格納されます 。


これで,$Recycle.Bin がゴミ箱の実体であるのを
確かめることができた。


今後,ハードディスクの中身をドライブごとコピーするような場合,

$Recycle.Bin の中身をコピー対象から除外するように気をつけよう。

そうしないと,不要なゴミまでコピー・バックアップされてしまうから。

Windowsスマートチューニング (157) Win 7編: Robocopyコマンドを使用したバッチファイルの作成と使用方法 | マイナビニュース
http://news.mynavi.jp/column/windows/...

  • robocopyコマンドの「/XD」は、コピー対象から取り除くフォルダーを指定
    • ドライブ情報や一部のシステムファイルを保存する「System Volume Information」フォルダーや、
    • ごみ箱フォルダーの実体である「$RECYCLE.BIN」フォルダー(「Recycled」は古いWindows OSで使用)を取り除きました。

(1−2)ゴミ箱の中身を空にする実験用のWindowsバッチ

コマンドプロンプトから下記のコマンドを実行すると,
ゴミ箱を空にできる。

rd /s %systemdrive%\$Recycle.bin

もし, コマンドプロンプトを特権なしでふつうに実行している場合,
カレントユーザのゴミ箱だけが削除に成功する。


その場合,ほかのユーザのゴミ箱については
アクセスが拒否されました。
と表示され,中身の削除に失敗する。


また,このようにCUI経由でゴミ箱の中身を削除した場合,
デスクトップ上でゴミ箱のアイコンは再描画されず,
中身が空になっていないような見かけのままだ。


GUI経由で,つまりエクスプローラでゴミ箱を開けば
デスクトップ上のアイコンの描画も更新される。


参考:

windows - how to empty recyclebin through command prompt? - Stack Overflow
http://stackoverflow.com/questions/92...

  • rd /s %systemdrive%\$Recycle.bin
  • Do note that this action will permanently delete all files and folders currently in the Recycle Bin from all user accounts.
  • Additionally, you will (obviously) have to run the command from an elevated command prompt in order to have sufficient privileges to perform this action.
  • the change in bin status may not reflect in Explorer (the desktop icon) until you actually open the Recycle Bin and/or refresh the desktop

(2)シェル名前空間とシェルAPI・アイテムID

(2−1)シェル名前空間とアイテムIDについて

前述したように,ゴミ箱の実体は各ドライブに分散している。


しかし,分散した実体をひとまとめにして,デスクトップ上では1つのアイコンで表示されている。

ファイルシステムの構造とは別に,ゴミ箱は独立した別の構造を持っているかのように見える。


どうしてこういうことが可能なのか?というと,
ゴミ箱は「シェル名前空間」上の特別なフォルダだから。


Windowsのシェル名前空間とは,
ファイルシステムとは別の,
ユーザにとって理解しやすいフォルダ構造のこと。

エクスプローラの左側を見ると,
「デスクトップ」を最上位としたツリー構造が表示されるが,
これが「シェル名前空間」だ。


これがあるおかげで,ユーザから見てゴミ箱はアクセスしやすい。

各ドライブごとに分かれて存在しているはずの実体を
仮想フォルダとして一まとめに扱うことができる。


シェル名前空間およびアイテムIDについて理解するための参考リンク:

アイテムIDリスト
http://eternalwindows.jp/shell/shelln...

  • シェル名前空間とは,デスクトップをルートとしたアイテムの階層
    • 通常のファイルやフォルダに加えて、ごみ箱やコントロールパネルなどの仮想フォルダも含まれている。
    • シェル名前空間のルートに存在するデスクトップは仮想フォルダであり、 ファイルシステムにおけるデスクトップと異なる点に注意。
    • シェル名前空間は、ユーザーにとって便利な仮想フォルダ(特殊なフォルダ)を作り出して提供する仕組みといえる。
  • シェル名前空間を使用した最も身近なアプリケーションはエクスプローラー。
  • ファイルシステムであれば、ファイルパスという一意の文字列でファイルやフォルダを識別できる
    • 仮想フォルダではそのようなパスを使用することはできない
    • そのため,アイテム(ファイルやフォルダ)を一意に識別する別の仕組みが必要となり,そのために用意されているのが「アイテムIDリスト」という仕組み。
    • アイテムIDとは1つのアイテムを識別する値。


アイテム ID リスト
http://oldworldgarage.web.fc2.com/pro...

  • 「シェル名前空間」とは、簡単に言うと通常のファイルシステムの上位概念のこと。
  • シェル名前空間のアイテムを識別するためのものが「アイテムIDリスト」
  • 「ごみ箱」の場合:
    • CSIDL:CSIDL_BITBUCKET
    • KNOWNFOLDERID:FOLDERID_RecycleBinFolder


アイテムIDリストとは?
http://www.kab-studio.biz/Programing/...

  • アイテムIDは「単一ファイル(フォルダ)名」のみを示します。
    • 文字列(ファイルのフルパス)の場合には、ファイルだけも、フルパスも、途中のフォルダふたつなんていうのも、どんな形でも示すことができます
    • しかしアイテムIDの場合は必ずひとつのファイルかフォルダだけを示します(一部を除く)
    • つまり,ファイルパスで表現すると,文字列の中に途中でたどるフォルダ階層をいくつも含めることができるが,アイテムIDの場合はそれができない。
  • フルパスをアイテムIDで示すには,アイテムIDリストを使う。
    • アイテムIDリストとはアイテムIDが連なっているもの。
    • フルパスを示すアイテムIDリストは、パスのアイテムIDが連なってできている。



http://nienie.com/~masapico/snmemo.txt

  • シェル名前空間は、フォルダとファイルオブジェクトの集合である。
    • デスクトップ、マイコンピュータ、ネットワークコンピュータなどの、実際のオブジェクトが存在しないフォルダを仮想フォルダと呼ぶ。
    • ファイルオブジェクトの例としては、ファイルや、「ユーザ補助」「日付と時刻」などのコントロールパネル中に含まれるオブジェクトが挙げられる。
    • シェル名前空間上のフォルダやファイルオブジェクトは、エクスプローラで閲覧・操作を行うことができる。
  • シェル名前空間上のオブジェクトには、アイテム識別子およびアイテム識別子リストが関連付けられている。
    • あるフォルダに含まれるオブジェクトは、そのフォルダ内でユニークなアイテム識別子をもつ。
  • アイテムID関連の内部的な実装:
    • アイテム識別子リストのポインタは、PIDLと呼ばれる。
    • フォルダは、IShellFolderを実装するCOMオブジェクトである。
    • シェル名前空間上のオブジェクトは、表示名と呼ばれる文字列を持つ。


シェルエクステンションって?
http://www.kab-studio.biz/Programing/...

  • ウィンドウズが持つシェルは、「ネームスペース」と呼ばれています。(シェル名前空間のこと)
    • このネームスペースは主にファイル関連の拡張を行うもので、この機能によって無機的なファイルやフォルダを解りやすいオブジェクトに見せかけることができます。  
  • ここで重要なのは「見せかけている」ということです。シェルはあくまで仲介役であって、メインではありません。
    • ファイルやフォルダはウィンドウズの持ち物です。シェルは、それを見せかける「色眼鏡」でしかないということです。
  • フォルダ中のiniファイルにおいて,「desktop.ini」−「CLSID」−「レジストリ」−「COMインターフェイス」という流れをたどる。
    • CLSIDとは、クラスIDという意味です。

(2−2)シェルAPIを使って,プログラムからWindowsにアクセスする各種言語のサンプル

シェル名前空間を操作するためのAPIが,シェルAPI。

例えばWindows APIでゴミ箱にアクセスするには,SHFileOperation などを使用する。

この関数は「SH」で始まるので,シェルAPIの一部だ。


シェルAPIについて:

進め!中級プログラマー 創刊号
http://www.asahi-net.or.jp/~GV4J-SGUR...

  • Windowsにおいてシェルと対話する最も簡単な方法は, シェルAPIを利用するもの。
  • シェルAPIとは、SHで始まる関数群及びその他のシェルに作用する関数群を合わせたもの
    • C系言語では「shellapi.h」「shlobj.h」で定義されている。
  • シェル内で管理されているアイコンなどのシステムリソースにアクセスしたりできる。
  • シェルAPIのSHFileOperation関数は,ファイルシステム上のコピー、移動、リネーム、削除の各処理を行う。


C言語で,シェルAPIでゴミ箱にファイルを送るサンプルコード:

Programming Windows Maniacs - プログラミング ウィンドウズ マニアックス - ゴミ箱にファイルを移動するには
http://prog.rulez.jp/shell_filestotra...

  • ゴミ箱にファイルを移動するようなシェルの処理は、SHFileOperation () APIにより行うことができます。
  • 引数として使用される SHFILEOPSTRUCT 構造体の wFunc メンバに FO_DELETE を指定すると、ゴミ箱へ移動する処理になります。

C++でゴミ箱に移動するサンプルコード:

ファイルを列挙する
http://www.kab-studio.biz/Programing/...

  • アイテムIDの取得方法. SHGetSpecialFolderLocation()というAPIを使用する
  • この関数を使用すると、ゴミ箱やコントロールパネルといった特殊なフォルダを示すアイテムIDを直接取得することができます。

.NETでゴミ箱に移動するサンプルコード:

ファイルをごみ箱に入れるには?(My機能活用)[2.0のみ、C#、VB] − @IT
http://www.atmarkit.co.jp/fdotnet/dot...

  • ファイルをごみ箱に移動させるには、VB用に用意されたFileSystemクラス(Microsoft.VisualBasic.FileIO名前空間)の静的メソッドであるDeleteFileメソッドにより可能だ。もちろんこのメソッドはC#からも利用することができる。
  • DeleteFileメソッドの第1パラメータには削除するファイルのパス名、そして第3パラメータにはRecycleOption.SendToRecycleBinを指定

Excel VBAでゴミ箱に移動するサンプルコード:

Office TANAKA - Excel VBA Tips[ごみ箱に削除する]
http://officetanaka.net/excel/vba/tip...

  • ファイル(またはフォルダ)をごみ箱に移動するには、SHFileOperationというAPIを使います。
  • SHFileOperationは、Windowsが標準で行うコピーや移動などのファイル操作を呼び出すAPIです。
    • 「ファイルを移動しています」などのメッセージと共に、ファイルが移動しているアニメーションを表示するにも、このSHFileOperationを使います。

ファイルをゴミ箱に移動するPowershellのサンプルコード:

windows - What is the command line way of sending files to the recycle bin? - Super User
http://superuser.com/questions/24662/...

  • In XP it is C:\RECYCLER, in Vista and later C:\$Recycle.bin.
  • If you have powershell installed:

$sh = new-object -comobject "Shell.Application"
$ns = $sh.Namespace(0).ParseName("PATH\TO\FILE\TO\DELETE")
$ns.InvokeVerb("delete")

(3)WSHでゴミ箱にアクセス

(3−1)WSH・VBScriptやJScriptで,ファイルをゴミ箱に送る方法(CSIDLやKNOWNFOLDERIDを使う)

WSHからごみ箱にアクセスしてみよう。

そのためには,CreateObjectでシェルを呼び出し,シェル名前空間を操作すればよい。

シェル名前空間の中で,ゴミ箱を表す定数は10だ。

特殊フォルダーのパスを取得するVBScript | 初心者備忘録
http://www.ka-net.org/blog/?p=3782

  • ShellオブジェクトのNameSpaceメソッドを使うとFolderオブジェクトが取得できるので、そこから特殊フォルダーのパスを得ることができます。
    • ゴミ箱の場合の定数は,ssfBITBUCKET = 10 
  • また,フォルダーのパスを得るのにCSIDL値を用いることもできる。
    • ゴミ箱の場合は CSIDL_BITBUCKET = 10 '<desktop>\Recycle Bin 


ここで出てきた10という定数は,
CSIDLもしくはKNOWNFOLDERID(ノウン・フォルダー・ID)という。

特殊フォルダを一意に識別するためのWindowsの定数だ。

CSIDL
http://chokuto.ifdef.jp/urawaza/prm/C...

  • CSIDL 値は、 Windows システムに存在する特殊なフォルダを識別するための、一意でシステムに依存しない方法をアプリケーションに提供する


HARD DAY'S NIGHT ブログ » Windowsの特別なフォルダ(SHFolders)の列挙
http://www.livesamples.net/blog/windo...

  • MSDNによると、CSIDL を使用する方法はWindows Vista 以降は、互換性のために残されていて、今後は、KNOWNFOLDERID を使用するようにとのこと


[818_シェル名前空間と項目識別子] - Mr.XRAY
http://mrxray.on.coocan.jp/Delphi/plS...

  • 仮想フォルダは,ディスク上に,実際のディレクトリは存在しません.
  • マイクロソフトでは,特殊フォルダの取得に CSIDL を使用する方法は互換性のために残し,Vista 以降では,KNOWNFOLDERID を使用することを推奨しています.
    • この KNOWNFOLDERID には,Windows 7 から導入された [ライブラリ] も含まれています.


macrobilis > visual c++
http://www.geocities.co.jp/SiliconVal...

  • CSIDL_BITBUCKET ごみ箱


なお,単純なファイルパスだけでは
ゴミ箱を指定することはできない。

前述の定数をどうしても使う必要がある。

ゴミ箱にはファイルパスが無いので通常の方法でファイルを移動出 【OKWave】
http://okwave.jp/qa/q3029518/a9301620...

  • ゴミ箱にはファイルパスが無いので通常の方法でファイルを移動出来ません。


調べ物:WSHでゴミ箱にファイルを移動する:待つとMishikaば:So-net blog
http://mishika.blog.so-net.ne.jp/2010...

  • Recycledフォルダに移動してもゴミ箱には入らない。
    • ユーザ操作でゴミ箱に移動する場合、OSでは実際にファイルのリネームが行われているので、通常の移動とは異なるため。
  • ただ、RecycledフォルダはOSの特殊フォルダなので、特殊フォルダとして明示すればいい


WindowsXPでコマンドを使用して任意のファイルをゴミ箱に移動する方法を教えてください。 - 楽天 みんなで解決!Q&A
http://qanda.rakuten.ne.jp/qa1891172....

  • DOSプロンプトでは、ゴミ箱にファイルを移動させるコマンドは存在しません。


そして,ゴミ箱という「移動先フォルダ」を指定した後で,
捨てたいファイルの移動操作を実行するためには,
NameSpaceのMoveHereを使う。

3.4 フォルダをコピー・移動する (CopyHere, MoveHere) [VBScript Tips]
http://www.happy2-island.com/vbs/cafe...

  • どちらのメソッドも、NameSpaceメソッドで作成したFolderオブジェクトのメソッドです。


テキストエディタを愛す 編集中の文書を「ごみ箱」へ移動する
http://kshi2010.blog2.fc2.com/blog-en...

  • 編集中の文書を即座に「ごみ箱」へ移動するEmEditorマクロ。ディスク上の元ファイルを「ごみ箱」へ移動し、文書を閉じる

sha = new ActiveXObject("Shell.Application");
sha.NameSpace(ssfBITBUCKET).MoveHere(document.FullName);


Windows Script Wiki - テクニック
http://winscript.s41.xrea.com/wiki/?%...
Const ssfBITBUCKET=10
Set Folder=Shell.NameSpace(FolderName)
Set FolderItem=Folder.ParseName(FileName)
Shell.NameSpace(ssfBITBUCKET).MoveHere FolderItem


MoveHereによるファイル移動は,非同期で進むという点に注意。

削除コマンドが発行されるだけで,削除の完了を待ってはくれないということ。

vbsでゴミ箱への移動 - BIGLOBEなんでも相談室
http://soudan1.biglobe.ne.jp/qa302951...

  • Set n = o.Namespace(ssfBITBUCKET)
  • n.movehere "c:\temp\test.txt"
  • 削除処理が完了するまえに、非同期でスクリプトは進行します。 このため、削除処理が終わる前にスクリプトが終了すると削除処理はキャンセルされます。


ファイルやフォルダをごみ箱に送るバッチファイル(XP): Windows Script Programming
http://scripting.cocolog-nifty.com/bl...

  • XPまでは、FolderItem.InvokeVerb('delete')は同期
    • Shell.NameSpace(10).MoveHere(FolderItem)は非同期です。


MoveHereのかわりに,InvokeVerbを使ってもよい。

この場合,ゴミ箱に送ってもよいですか?という警告ダイアログが必ず表示される。消す方法はない。

また,InvokeVerbに渡す引数は,Windowsの言語設定により変わってしまうという点に注意。

スクリプト Send a File to the Recycle Bin
https://gallery.technet.microsoft.com...
' Use the Shell to send the file to the recycle bin
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(strFolderParent)
Set objFolderItem = objFolder.ParseName(strFileName)
objFolderItem.InvokeVerb("&Delete")


Send file to recycle bin in batch file or script (PowerShell?)
http://microsoft.public.platformsdk.s...

  • You can send a file to the recycle bin in script by invoking the verb "delete" (e.g. by calling IShellDispatch2.ShellExecute or FolderItem.InvokeVerb),
    • but I don't see any way to prevent the "are you sure" confirmation from popping up, short of disabling it globally.


Delete files to Recycle Bin via VBS and/or WMI (Network Steve Forum)
http://www.networksteve.com/forum/top...

  • As was noted, the recycle bin is a feature of the Windows Explorer shell and you can invoke the "delete" verb.
    • However, this is not robust as the verb required is language-specific.


またInvokeVerbを使えば,
「ゴミ箱を空にする」という処理を安全に実行することもできる。

【おすすめ】ゴミ箱を空にする.vbs ( ソフトウェア ) - プログラマー豆知識 - Yahoo!ブログ
http://blogs.yahoo.co.jp/miori8888/23...

  • .NameSpace(ssfBITBUCKET).Items.Item.InvokeVerb "ごみ箱を空にする(&B)"

(3−2)WSHで,CLSIDでゴミ箱を開く方法

シェル名前空間上で「ゴミ箱」を指定するために,
CLSID(クラスID)を使ってもよい。

※とても紛らわしいのだが,前述の「CSIDL」と,
ここで現れた「CLSID」とは別物だ。


CLSIDによる特殊フォルダの指定について:

Program Tips
http://www.crimson-systems.com/tips/t...

  • CLSIDパスにより、ごみ箱などの特殊フォルダを開くことができます。


CLSID一覧 - AutoHotkeyJp
https://sites.google.com/site/autohot...

  • ::{645ff040-5081-101b-9f08-00aa002f954e} ゴミ箱


CLSID List (Windows Class Identifiers)
https://www.autohotkey.com/docs/misc/...

  • ::{645ff040-5081-101b-9f08-00aa002f954e} Recycle Bin


CLSIDでゴミ箱を指定する,WSHのサンプルコード:

ディレクトリ内のファイルの処理
http://winofsql.jp/VA003334/vbsguide0...

  • ディレクトリをごみ箱へ移動。
    • この処理も zip 圧縮と同じく非同期処理です。移動処理なので、移動元が無くなるまで待ちます。
    • ごみ箱の特殊フォルダとしての番号は 10 です ( ssfBITBUCKET = 0xa )

Set objDelFolder = Shell.NameSpace( "::{645FF040-5081-101B-9F08-00AA002F954E}" )
Call objDelFolder.MoveHere( objFolder.Self, 0 )


この「CLSIDでゴミ箱を指定する」というテクニックは,
デスクトップ上でゴミ箱を非表示にする時によく使われる。

デスクトップから「ごみ箱」を消してしまう 日経トレンディネット
http://trendy.nikkeibp.co.jp/article/...

  • デスクトップ上の「ごみ箱」を表示しない方法を紹介しよう。
    • なお、「ごみ箱」を「マイコンピュータ」の中に作っておけば、「ごみ箱」を利用できなくなることはない。


Windows Vista または Windows XP でデスクトップにごみ箱を表示する方法
https://support.microsoft.com/en-us/k...

  • 次のレジストリ キーを見つけます。
    • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel
  • DWORD 値を右クリックし、[修正] をクリック
    • {645FF040-5081-101B-9F08-00AA002F954E} [値のデータ]
  • この値を 1 に設定してごみ箱アイコンを非表示にします


フォルダが七変化!?
http://un-no-un.net/Folder.html

  • 「新しいフォルダ」を作ってください.
  • そして、「そのフォルダを右クリック」→「名称の変更」で名称を 「適当な名前.{645FF040-5081-101B-9F08-00AA002F954E}」にしてEnterキーを押してください
  • すると、なんとフォルダがゴミ箱になってしまいます!
    • その変化したフォルダを開いてみるとゴミ箱が開きます、しかもちゃんとゴミ箱として機能します(笑)


ところで,CLSID以外にもゴミ箱を指定する識別子はある。

シェルコマンドといって,エクスプローラのロケーションバーに入力できる文字列だ。

ゴミ箱を開くには,「shell:RecycleBinFolder」とする。


ただしシェルコマンドは,
エクスプローラから開くときに限定され,
WSHから利用するすべは無い。

Shell コマンドで開く特殊フォルダー一覧(Windows 7,8)
http://pasofaq.jp/windows/mycomputer/...

  • shell:RecycleBinFolder →ごみ箱

おまけ:Mac OSXの場合

Mac OSXでも,ゴミ箱の内部的なファイルパスが存在する。
Finderで表示が可能。

Macのゴミ箱フォルダの場所とそれをFinderのツールバー・サイドバーに登録する方法 / Inforati
http://inforati.jp/apple/mac-tips-tec...

  • 不可視フォルダである「ゴミ箱フォルダ」を表示する方法
  • Finderの「移動」メニューから「フォルダへ移動」を選択し,「/Users/[英語のユーザ名]/.Trash」と入力すると隠しフォルダである「.Trash」に移動することができる