Power Automate Desktopでファイルをゴミ箱に送る

Power Automate Desktopでファイルをゴミ箱に送るフローを作ってみました。

「ファイルの削除」アクションを使用してファイルを削除するとゴミ箱に入らず完全に消えてしまいます。これだと後から見たいときに困る場合があります。

ゴミ箱に入れるアクションが見つからないのでVBScriptを使ってゴミ箱に送ります。

一応テストはしていますが、よくコードを理解してテストをしてからご利用ください。


VBScriptでゴミ箱に送る方法

VBAを使っていた時にはAPIを使って処理していましたが、シェルオブジェクト(実体はエクスプローラー)を使えば簡単に記述できるようです。

vbsでゴミ箱への移動


Power Automate DesktopからVBScriptを使う方法は次のページに書かれています。

演習問題 - VBScript を使用して剰余を計算する


実際のコードは次の通りで、2行です。

Const ssfBITBUCKET = 10
CreateObject("Shell.Application").Namespace(ssfBITBUCKET).MoveHere "%SelectedFile.FullName%"

1行目は定数ssfBITBUCKETに10を指定しています。Namespaceに直接10を指定しても動作はしますが、10だと後から見た時になんだかよくわからなくなるため、名前付きの定数を使ってわかりやすくしています。ちなみにBit Bucketとはヌルデバイス(Unixなら/dev/null)を指すようです。


2行目はオブジェクト操作になれていないと意味が不明だと思うので、次のようにばらして書いてみました。

Const ssfBITBUCKET = 10
Set uShell = CreateObject("Shell.Application")
Set uRecycleBin = uShell.Namespace(ssfBITBUCKET)
uRecycleBin.MoveHere "%SelectedFile.FullName%"

  1. 定数設定
  2. ShellオブジェクトのApplicationプロパティ(値)からオブジェクトを生成します。
  3. ShellオブジェクトのNamespaceメソッド(命令)を実行してゴミ箱フォルダーオブジェクトを取得します。
  4. ゴミ箱フォルダーオブジェクトのMoveHereメソッドを使って、指定されたパスをゴミ箱フォルダーに移動します。
    SlectedFile変数は事前にアクションで代入しておき、FullNameプロパティを使ってファイルのフルパスを取得します。
    パスに空白が入っている(例えば program files)場合に備えて変数をダブルクォーテーションで囲っておきます。

アクションに指定すると次のようになります。

使用例


  1. ユーザーにファイルを選択させます。
  2. ゴミ箱に送ります。
  3. ファイルが削除されるまで待機します。

上のページを読むと、MoveHereは非同期、つまり削除処理が終わるのを待たずにメソッドが終了してしまうため、すぐに次のアクションに進んでしまいます。

それで問題ない場合も多いと思いますが、削除が完了した事を確認するため、3番の処理も入れてみました。


デスクトップフロー化

使うたびに、ファイル部分の手直しが必要なのが面倒になったので、デスクトップフロー化してみました。

VBScriptのコードは基本的に変わりありません。

Const ssfBITBUCKET = 10
CreateObject("Shell.Application").Namespace(ssfBITBUCKET).MoveHere "%uFilePath%"

uFilePathを入出力変数として定義します。


次のように他のフローから呼び出します。

他のデスクトップフローを呼び出すためパフォーマンス的には良くないかもしれませんが、時間がそれほど問題ない場合にはこちらの方が便利です。


フォルダー削除

フォルダーごと削除したい場合には、MoveHereメソッドに対して、パスではなくFolderItemオブジェクトもしくはFolderItemsオブジェクトを指定する必要があると書かれています。

Folder.MoveHere method

次のページを参考にしてフォルダーを削除コードも書いてみました。

WSH/フォルダを選択して移動


Const ssfBITBUCKET = 10
uPath = "%uFullName%"
Set uShell = CreateObject("Shell.Application")
Set uRecycleBin = uShell.Namespace(ssfBITBUCKET)
Set uFSO = CreateObject("Scripting.FileSystemObject")
If uFSO.FolderExists(uPath) Then
    Set uFolder = uShell.Namespace(uPath)
    uRecycleBin.MoveHere uFolder.Self
Else
    uRecycleBin.MoveHere uPath
End If


  1. 定数を定義
  2. Power Automate Desktopのパス変数をVBScriptのuPath変数に設定
  3. ゴミ箱フォルダーのオブジェクトを取得
  4. フォルダーの存在判定メソッドを使うためにFileSystemObjectを取得
  5. uPathで指定されたフォルダーが存在していれば
  6.   uPathで指定されたフォルダーオブジェクトを取得
  7.   uPathで指定されたフォルダーをゴミ箱フォルダーに移動
  8. 存在しない場合
  9.   uPathをゴミ箱フォルダーに移動
  10. If End


手順7補足

MoveHereにはFolderItemオブジェクトを指定することになっています。Namespaceが返すのはFolderオブジェクトなので、.Selfプロパティを使ってFolderItemオブジェクトを返しています。

試しに.Selfを省略して指定したところ、それでも削除されました。Selfはデフォルトプロパティなのかもしれません。

なおFolderオブジェクトにはSelfプロパティは存在しません。VBAでデバッグしてみるとNamespaceメソッドで取得したオブジェクトの型はFolder3となっています。Folder3のリファレンスは見当たりませんがFolder2のリファレンスにはSelfプロパティの記載があります。

Folder Object

Folder2 object

アクションに指定した場合


使用例


一応、フォルダーが削除されるまで待ってみました。待たない場合Loop以降は不要です。


シェルとは

WindowsなどのOSのプロセス管理やメモリ管理などの機能はカーネル(核)と呼ばれ、ユーザーとのやり取りをするインターフェイスはシェル(殻)と呼ばれています。

Windowsの場合はエクスプローラー(ブラウザのInternet Explorerの事ではありません)やそれによって制御されているデスクトップがシェルになります。

エクスプローラーをプログラムから制御することができれば、エクスプローラーの機能であるゴミ箱に送るも使えるという事です。

デスクトップはエクスプローラーによって制御されているため、エクスプローラーがフリーズしたり異常終了したりすると、デスクトップが操作できなくなったり画面が真っ暗になったりします。


コメント

アクセス数の多い投稿

セキュリティ対策ソフトのノートンが詐欺ソフトまがいになってしまってショック

ZIPファイルを開こうとすると、展開を完了できません、と言われる

Excel 2019 クエリが原因で日本語入力の一文字目が勝手に確定する

突然滅茶苦茶遅くなったPCがWindows Updateのキャッシュクリアで復活

Windows セキュリティーのビックリマークが消えない

Power Automate Desktopでブラウザでダウンロードしたファイルを処理する

Excel VBAからODBCを使ってデータを簡単に取得する

オカムラ家具のOAチェアー、コンテッサを分解清掃

Teamsで日本語入力すると左上に変換ウィンドウが出る

ChatGPTが日本語からVBAのコードを生成できてたまげる