knowledge AutoMate 自習用コンテンツ その3 - 解説

自習用コンテンツ その3(https://automate.sct.co.jp/knowledge/12047/)の内容は如何でしたでしょうか?
簡単に出来てしまった方も、難しかった方もいたかと思います。

完成イメージの画像はこちら

下記では、解説を書いていきます。
(解答例のコードは、ページ最下部に書いています。)


■観点
今回のコンテンツでは、「コンピューターの観点から利用しやすい方法の使用」および「エラーの意図的な無視」を観点としました。
「当該フォルダよりも下の階層にファイルを含まない」=「フォルダサイズが0バイト」という条件に気が付き、利用できるかどうかがポイントになります。
  

■1. 処理対象フォルダ一覧の取得

まずは、作業対象となるフォルダのリストを取得します。
今回は、「ファイル システム - 情報の取得」アクションを利用し、以下のように設定します。
①取得対象は「フォルダー」のみ。ファイルの情報はデータセットに含めなくてよい
②ワイルドカードを付けずにフォルダ名だけを指定すると、当該フォルダの情報のみを取得する命令になるので、ワイルドカードが必要
③データセットは都度作成されるものである為、任意の名前を入力
④ディレクトリサイズが重要な判断材料なので、必ず計算の上でデータセット化する
⑤サブフォルダも削除/残すの作業対象になるので、取得
(図1: 「ファイル システム - 情報の取得」アクション設定)

  

■2. ループの設定

■1でフォルダの一覧を取得したため、それらを順繰りにチェックするためにループの設定をします。
今回は、「Loop - データセット」を使用します。
「Loop - データセット」を利用すると、データセットの行数を毎回明示的に指定しなくてもループのたびに参照行が変化します。
そのため、ループのインデックス用の変数を作成して管理する手間を減らすことが出来ます。
今回は、データセットのデータでチェックしない行は存在しないので、特別な設定は何もせずに設定を確定します。
(図2:「Loop - データセット」の設定)

  

■3. 「IF」分岐の条件の設定

特定の条件に基づいて処理を行う/行わないを判断するには、「IF - 条件式」アクションを使用します。
今回は「フォルダサイズ」が「0」かどうかで条件を判定し、「0」であればIFブロック内を通るように設定するので、以下のような設定値になります。
(図3:「IF - 条件式」の設定)

  

■4. フォルダの削除

■2で調べた結果フォルダサイズが0であれば、そのフォルダは消していいことになるので、「ファイル システム - 削除」アクションでフォルダを削除するよう設定します。
(図4:「ファイル システム - 削除」の設定)

次に、エラーを無視して続行する設定をします。
今回の処理では、親フォルダのサイズが0バイトだった時点でそのフォルダを削除しますが、データセットには子フォルダの情報が残存します。
そのためフォルダの実体は削除されていても、ループ処理され、かつIFの条件に合致するので処理しようとしてしまいます。
ただし、当該フォルダはもう存在していないので、「フォルダが存在しない」旨の実行エラーとなりタスクが停止してしまいます。
(図5:フォルダが消されていることによりタスク実行エラー)

今回の場合、親フォルダが存在しないことにより、子フォルダが存在せず削除できないことは想定の範囲内なので、無視して続行する設定をします。
(図6:エラー時設定)

このように設定することにより、「下の階層のフォルダから順に確認」「結果的に空になったら親フォルダも消す」という面倒な手順を踏まなくて済みます。

  

今回定義する処理は以上になります。

(処理構築例:展開するにはここをクリック)
<!--「フォルダ」を対象に、サブフォルダを含めて情報を取得。この際、ディレクトサイズを計算する。-->
<AMFILESYSTEM ACTIVITY="get" MODE="folder" SOURCE="C:\TEMP\00008982\*" RESULTDATASET="ds_folders" FILEPROPERTY="fullname" CALCULATEDIRSIZE="YES" SUBFOLDERS="YES" />
<!--フォルダ一覧のデータセットを順繰りにループ-->
<AMLOOP ACTIVITY="dataset" DATASET="ds_folders" />
<!--フォルダサイズが0(=そのフォルダ以下の階層にファイルが存在しない)であれば、削除-->
<AMIF EXPRESSION="%ds_folders.Size% = 0" />
<!--既にフォルダが削除されている場合は、想定の範囲内なので無視して続行-->
<AMFILESYSTEM ACTIVITY="delete" AM_ONERROR="CONTINUE" MODE="folder" SOURCE="%ds_folders.Fullname%" />
<AMIF ACTIVITY="end" />
<AMLOOP ACTIVITY="end" />

なお、エラーを無視して次に進む部分は、「IF - フォルダーの存在」アクションを使用し、無ければスキップするという形で構築しても構いません。