Power Automate Desktopでファイルを拡張子ごとに自動で振り分ける|Pythonと同じ1000件で比べました

python

ダウンロードフォルダに、写真も PDF も Excel もごちゃまぜに溜まっていく。拡張子ごとにフォルダへ分けるだけなら、Python なら20行ほどで書けます(Pythonでファイル・写真を自動整理する方法)。

では、プログラムを書かずに、Windows で無料で使える Power Automate(Power Automate Desktop・PAD)で同じことはできるのか。同じルール・同じ試し用のファイル100件と1000件で、PAD と Python の両方を実際に動かして比べました。組むときにつまずいた所も、出た画面のとおりに書きます。

先に結論

できる:PAD でも、1000件すべてを決めたフォルダに振り分けられました。

時間は大きく違う:1000件で、PAD は約13分(796秒)、Python は0.66秒でした。

同じ名前のファイルがあると、壊れ方が逆になる:Python(記事のコード)は前からあったファイルを黙って上書きして消しました。PAD(初期の設定)は何も消さず、新しいほうを黙って元の場所に残しました。どちらも、何も知らせません。

大文字の .JPG に注意:PAD の Case は大文字と小文字を区別するので、そのままだと .JPG が「その他」に入ります。小文字にしてから比べるアクションを1つ足せば直ります。

やらせる仕事:Python の記事と同じルール

フォルダ C:\pad_shiken\受け取り に入っているファイルを、拡張子ごとに、その中のフォルダへ移します。ルールは Python の記事と同じです。

拡張子移す先のフォルダ
.jpg .jpeg .png画像
.pdfPDF
.docx .docWord
.xlsx .xlsExcel
.zip圧縮ファイル
それ以外(拡張子なしも)その他

試し用のファイルは、中身が数バイトの文字だけのダミーを Python で作りました。100件の中に、つまずきそうなものをわざと混ぜてあります。

  • 大文字の .JPG(6件)
  • 拡張子の無いファイル、.tar.gz のように点が2つあるファイル
  • 資料 (1)_0043.JPG のような、空白とかっこ入りの名前

「できた」の基準は、動かす前に決めました。全部のファイルが決めたフォルダに入り、元のフォルダに1件も残っていないこと。数えるのも Python の小さな道具でやっています(目で数えると見落とすので)。

PAD で組む

できあがったフローの上のほうは、こうなります。全部で28アクションです。

PAD のフロー。1行目 フォルダー内のファイルを取得、2行目 For each、3行目 テキストの文字の大きさを変更、4行目 Switch TextWithNewCase、5行目から Case .jpg と変数の設定が並ぶ
できあがったフローの上のほう。For each の中で、拡張子を小文字にしてから Switch で分けています。

1. フォルダー内のファイルを取得

左の「アクション」の「フォルダー」から「フォルダー内のファイルを取得」をドラッグし、フォルダーに C:\pad_shiken\受け取り を入れます。ファイル フィルターは * のまま。取れたファイルの一覧は、変数 Files に入ります。

2. For each で1件ずつ繰り返す

「ループ」から「For each」をドラッグし、反復処理を行う値に %Files% を入れます。% で囲むのを忘れないでください(忘れるとどうなるかは後で書きます)。1件ずつ CurrentItem に入って回ります。

3. 拡張子を小文字にする

「テキスト」から「テキストの文字の大きさを変更」を、For each のすぐ下にドラッグします。

テキストの文字の大きさを変更の設定画面。変換するテキストに %CurrentItem.Extension%、変換先に 小文字、生成された変数 TextWithNewCase
変換するテキストは %CurrentItem.Extension%(拡張子)、変換先は「小文字」。結果は TextWithNewCase に入ります。

これを入れないと、大文字の .JPG が「画像」に行きません(後で、入れなかったときの結果を書きます)。なお、アクションの検索欄に「小文字」と入れても、このアクションは出てきませんでした。名前に「小文字」が入っていないためです。

4. Switch と Case で、移す先のフォルダ名を決める

「条件」から「Switch」をドラッグし、チェックする値に %TextWithNewCase% を入れます。その中に「Case」を、拡張子の数だけ並べます。

Case の設定画面。演算子 と等しい (=)、比較する値 .jpg
Case の設定。演算子は「と等しい (=)」、比較する値に .jpg。点も付けます。

それぞれの Case のすぐ下に「変数」の「変数の設定」を置き、変数 FolderName にフォルダ名(画像・PDF など)を入れます。最後に「Default case」を置き、その中で FolderName を「その他」にします。Default case には設定する項目がありません(開くと「このアクションは入力パラメーターを受け取らず…」と出ます)。

For each の中に Switch、その中に Case .jpg、さらにその中に 変数の設定 FolderName に 画像 が入っている
Case を1つ入れたところ。Case の中に「変数の設定」が一段下がって入っていれば正しい形です。

5. フォルダーの作成と、ファイルの移動

Switch の End の下(For each の End の上)に、2つ置きます。

アクション入れるもの
フォルダー → フォルダーの作成作成先 C:\pad_shiken\受け取り/新しいフォルダー名 %FolderName%
ファイル → ファイルの移動移動するファイル %CurrentItem%/宛先フォルダー C:\pad_shiken\受け取り\%FolderName%/ファイルが存在する場合 何もしない(初期のまま)

フォルダーがもうあっても、「フォルダーの作成」は止まりませんでした(1件ごとに毎回作ろうとしますが、そのまま進みます)。

コピーして使えるフロー

PAD のフローは、文字にしてコピーできます。デザイナーでフローの行をクリックし、Ctrl+A → Ctrl+C を押すと、次のような文字になります(この記事で動かしたフローそのものです)。

Folder.GetFiles Folder: $'''C:\\pad_shiken\\受け取り''' FileFilter: $'''*''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Files=> Files
LOOP FOREACH CurrentItem IN Files
    Text.ChangeCase Text: CurrentItem.Extension NewCase: Text.CaseOption.LowerCase Result=> TextWithNewCase
    SWITCH TextWithNewCase
        CASE = $'''.jpg'''
            SET FolderName TO $'''画像'''
        CASE = $'''.jpeg'''
            SET FolderName TO $'''画像'''
        CASE = $'''.png'''
            SET FolderName TO $'''画像'''
        CASE = $'''.pdf'''
            SET FolderName TO $'''PDF'''
        CASE = $'''.docx'''
            SET FolderName TO $'''Word'''
        CASE = $'''.doc'''
            SET FolderName TO $'''Word'''
        CASE = $'''.xlsx'''
            SET FolderName TO $'''Excel'''
        CASE = $'''.xls'''
            SET FolderName TO $'''Excel'''
        CASE = $'''.zip'''
            SET FolderName TO $'''圧縮ファイル'''
        DEFAULT
            SET FolderName TO $'''その他'''
    END
    Folder.Create FolderPath: $'''C:\\pad_shiken\\受け取り''' FolderName: FolderName Folder=> NewFolder
    File.Move Files: CurrentItem Destination: $'''C:\\pad_shiken\\受け取り\\%FolderName%''' IfFileExists: File.IfExists.DoNothing MovedFiles=> MovedFiles
END

使うときは、新しいフローを作ってデザイナーの空いた所をクリックし、Ctrl+V で貼り付けます。C:\\pad_shiken\\受け取り の所(3か所)を、自分の整理したいフォルダに書き換えてください。文字の中では \ が \\ と2つ重なって書かれます。

いきなり本物のフォルダで動かさない

まずは、コピーしたファイルを入れた試し用のフォルダで動かしてください。移動したファイルは、元に戻すのも手作業です。

組むときに、実際につまずいた所

このフローは、手順を見ながら画面で一から組みました。そのとき実際に起きたことです。

Switch が For each の外に入った

Switch をドラッグして落としたら、For each の中ではなく、For each の End の下に置かれました。これだと繰り返しの外なので、最後に1回しか動きません。「For each」の行と、その End の行のあいだに落とすと、中に入ります。中に入ると、一段右に下がって表示されます。

%Files% の % を忘れて、式のエラー

For each の値に Files と、% 無しで入れたところ、下にエラーが出ました。

エラーリストに 式 Files は list、datatable、または datarow である必要があります と出ている。For each の行は in 'Files' と引用符つきで表示されている
For each の行が in 'Files' と引用符つきになっています。変数ではなく、「Files」という文字として読まれています。

%Files% に直すと消えました。右上の {x} から変数を選ぶと、% は自動で付きます。

フォルダ名のうしろに、改行が入った

「変数の設定」の値を入れたあとに Enter を押すと、値のうしろに改行が入ります。見た目では分かりにくいのですが、デザイナーの表示で見分けられます。

変数の設定の行のうち、画像の行は1行で表示されているが、PDF と Word の行は 'PDF のあとで折れて、次の行に ' を割り当てる と出ている
「画像」の行は1行。「PDF」「Word」の行は、'PDF のあとで折れて、次の行に ' を割り当てる が出ています。これが改行の入っている印です。

このままだと、フォルダ名のうしろに改行が混ざります。値を開いて、うしろの改行を消しておきます(改行が入ったまま動かすとどうなるかは、試していません)。

パスのつなぎ目の \ が抜けて、実行時のエラー

実行したら、1件目のファイルの移動で止まりました。

ファイルの移動の行に赤い印。エラーリストに 宛先フォルダー C:\pad_shiken\受け取り画像 が存在しません と出ている
「宛先フォルダー C:\pad_shiken\受け取り画像 が存在しません」。「受け取り」と「画像」がくっついています。

宛先フォルダーに C:\pad_shiken\受け取り%FolderName% と、受け取り のうしろの \ を入れ忘れていました。C:\pad_shiken\受け取り\%FolderName% に直すと、最後まで動きました。保存の時点ではエラーにならず、動かして初めて止まるので気づきにくい所です。

「小文字」で検索しても、アクションが出てこない

拡張子を小文字にするアクションを探そうと、検索欄に「小文字」と入れても、何も出てきませんでした。名前が「テキストの文字の大きさを変更」だからです。「テキスト」のグループを開くと並んでいます。

アクションの一覧で テキスト のグループを開いたところ。テキストの文字の大きさを変更 が並んでいる
「テキスト」のグループの中の「テキストの文字の大きさを変更」。

大文字の .JPG が「その他」に入った

はじめは、手順3の「テキストの文字の大きさを変更」を入れずに、拡張子をそのまま Switch で比べていました。そのときの結果です。

フロー正しい場所違う場所元のフォルダに残った
拡張子をそのまま比べる9460
小文字にしてから比べる10000

違う場所に入った6件は、全部が大文字の .JPG で、「その他」に入っていました。PAD の Case の「と等しい (=)」は、大文字と小文字を別のものとして比べるためです。スマホやデジカメの写真は .JPG と大文字のことがあるので、実際のダウンロードフォルダでも起きます。

Python の記事のコードは、比べる前に .lower() で小文字にしているので、最初から「画像」に入ります。

同じ名前のファイルがあったとき

移す先のフォルダに、同じ名前のファイルがもうある場合も試しました。「画像」「PDF」「その他」の3つのフォルダに、移ってくるのと同じ名前のファイルを1件ずつ先に置いてから、100件を振り分けます。先に置いたファイルの中身は「前からあった同じ名前のファイル」という文字にしておき、あとで残っているかを確かめます。

前からあったファイル(3件)新しく来た同じ名前のファイル(3件)画面の知らせ
Python(記事のコード)上書きされて、消えた移された無し
PAD(ファイルが存在する場合=何もしない)そのまま残った移されず、元のフォルダに残った無し

どちらも何も知らせずに終わりました。違うのは、消えるか、残るかです。

PAD のほうは、元のフォルダに3件残るので、あとで見れば「何か残っている」と気づけます。Python のほうは、元のフォルダは空になり、件数もそろっているので、上書きで消えたことに気づく手がかりがありません。Python の記事の「よくある質問」にも「shutil.move は、移動先に同名ファイルがあると上書きしてしまいます」と書いてありますが、実際に動かすと、本当に一言も言わずに消えました。

ファイルの移動の設定画面。ファイルが存在する場合の一覧を開くと、何もしない と 上書き の2つだけが出ている
「ファイルが存在する場合」の選択肢は、「何もしない」と「上書き」の2つだけでした。

PAD の「ファイルが存在する場合」で選べるのは、「何もしない」と「上書き」の2つだけです。「上書き」にすると、Python と同じように前のファイルが消える側になるはずです(この記事では「上書き」は試していません)。名前を変えて両方残す、という選択肢はありません。迷ったら初期の「何もしない」のままにしておき、元のフォルダに残ったファイルは手で見るのが安全です。重複したファイルそのものを探したいときは、Pythonで重複ファイル・重複写真を見つけて整理する方法も参考にしてください。

かかった時間

PAD はデザイナーの「実行」から動かし、ファイルが元のフォルダから減り始めてから、最後の1件が減るまでを、外から0.05秒ごとに数えて測りました(PAD を開く時間などは入っていません)。

件数実行遅延時間1件あたり
PAD10050ミリ秒(初期のまま)98.47秒0.98秒
PAD10001ミリ秒(これ以上は下げられない)796.02秒(約13分)0.80秒
Python(記事のコード)100—0.06秒—
Python(記事のコード)1000—0.66秒—

「実行遅延」は、デザイナーのいちばん下にある、アクションとアクションのあいだの待ち時間です。0は受け付けず、1ミリ秒が下限でした。

最初は、この待ちが時間の大部分だろうと思っていました。ところが、50ミリ秒から1ミリ秒に下げても、1件あたりは0.98秒から0.80秒と、2割ほどしか縮みませんでした。時間の大部分は、待ちではなく、PAD がアクションを1つずつ動かすこと自体にかかっているようです。何にどれだけかかっているかまでは、分けて測っていません。

100件のときでも、実行中は「止まる気配がないな」と感じるくらい長く、1000件では13分ほど動きっぱなしでした。毎日数十件のダウンロードを片づけるくらいなら気になりませんが、何千件もの写真を一度に分けるなら、Python のほうが向いています。

Python 版と並べて

PADPython(記事のコード)
作るもの28アクション(ドラッグと入力)17行
1000件の時間約13分0.66秒
大文字の .JPGそのままだと「その他」へ(1アクション足して直る)最初から「画像」へ
同じ名前のファイル前のを残し、新しいほうを元に残す前のを上書きして消す
どちらも同じ所同じ名前のときも、何も知らせずに終わる

速さは Python が大きく上回りました。一方で、同じ名前のファイルの扱いは、PAD の初期の設定のほうが「消さない」側に倒れていました。どちらを選ぶにしても、動かしたあとに元のフォルダに何か残っていないか、一度は目で見るのがいちばん確かです。PAD と Python を別の仕事で比べたウェブページの更新チェックの記事や、PAD の Web 操作が止まる理由を調べたセレクターの記事もあわせてどうぞ。

確かめていないこと

  • 使っている最中のファイル(開いている Excel など)があるときの動きは試していません。
  • 毎日決まった時間に自動で動かす方法(無料版でできるか)は、この記事では試していません。
  • サブフォルダの中のファイル、ネットワーク上のフォルダ(NAS など)では試していません。
  • PAD の時間が何にかかっているか(ファイルの移動か、アクションの切り替えか)は分けて測っていません。
  • 試したファイルは中身が数バイトのダミーです。大きなファイルでは時間が変わるかもしれません。

検証した環境:Windows 11 / Power Automate(無料版)11.2609 / Python 3.14。試し用のファイルは Python で作ったダミーで、同じ並びのものを PAD と Python の両方で振り分けました(2026年10月13日)。

コメント

タイトルとURLをコピーしました