無駄ロボット研究所

起動すると自分で自分をシャットダウンするロボット ~瞬断! 自己オフスイッチ の巻

『無駄ロボット研究所』ではRPA(Robotic Process Automation)ツール「UiPath Studio」を使って役に立たない、無駄なロボットを作っていきます。業務を効率化するという本来RPAで実現すべき目的とは真逆のロボットたちをお楽しみください。

 ロボットになくてはならない機能? そうですね。OFFスイッチですね。暴走を止め、乗っ取りを阻止するためには、ロボットの動作を一発ですべて停止するスイッチはなくてはならない存在です。たとえ、それが自分自身を止めるためのものだったとしても……。

アレコレ試す

 ロボットが自らOFFスイッチを操作して、すべての動作を停止する――。

 なんてのは、映画やアニメなら、最終回の一歩手前にでもなるかもしれませんが、ソフトウェアのロボットだと、一瞬すぎて、物語にもならないのが現実です。耳馴染みがあるアレクサやSiriなら? うーん、どうですかね。いや、ないですね。

 とは言え、すべての動作を停止するOFFスイッチをロボット自らが操作できるようにするというのは、何というか相反する行為が混じり合った興味深い存在で、作り手側としては、ぜひ実装してみたいところです。

 では、UiPathのロボットで、どう実装するか? 実は、これがなかなか悩ましいのです。

試作品1号機:[閉じる]ボタンクリック

 まず、思いつくのは、人間の操作と同様に「UiPath Studio」の[閉じる]ボタンを操作する方法です。

 「UiPath Studio」では、マウス操作をエミュレーションできるので、“クリック”アクティビティを使って、画面上のいろいろな場所をクリックできます。通常、「UiPath Studio」は、ワークフロー実行時に最小化されますが、画面上でクリック先を指定するときに「F2」キーを押して、ウィンドウを戻してから[×]ボタンを指定すれば、自分自身でウィンドウ右上にある[×]をクリックさせることは可能です。

 しかし、結論から言うと、この方法は、うまくいきません。ワークフローの実行中は、[×]ボタンが、「UiPath Studio」の終了ではなく、ワークフローの停止に変更されてしまため、ワークフローの実行が停止されるだけで、「UiPath Studio」そのものは残ったままになります。

 [×]ボタンクリック後に表示される“実行を中止しますか?”というダイアログで[はい]をクリックさせたり、ホットキーで[はい]を選択させることもできませんでした。

[×]ボタンのクリックはできるが、その先に進めない

試作品2号機:タスクマネージャー操作

 続いてチャレンジしたのは、「タスクマネージャー」を使った方法です。

 「UiPath Studio」からWindowsの「タスクマネージャー」を起動し、UiPathのプロセスを強制終了しようという作戦です。

 しかし、これもうまくいきません。

 まず、「タスクマネージャー」ですが、これは特殊なアプリとなるため、“アプリケーションを開く”や“クリック”などのアクティビティから、画面上の要素を認識できません。画面上で指定を使ってもアプリそのものや画面上のボタンを認識できません。

 これも断念せざるを得ませんでした。

タスクマネージャーは操作できない

試作品3号機:プロセスを直接操作

 というわけで、最終的に行き着いたのが、プロセスを直接操作する方法です。

 実は、この方法は、真っ先に思いついた方法で、“たぶんできるだろう”という確信もあったのですが、いかんせん単純だし、すぐに完了してしまうので、“情緒もへったくれもないなぁ”と避けていました。

 が、やってみると、これはこれで実にロボっぽい。

 迷わず、一直線に、何の演出もなく、一瞬にして、自らをOFFにする様子を見ると、ロボ的には、これが正解なのだろいうという気がしてきました。

 単純にやるなら、“プロセスを強制終了”アクティビティを配置し、プロパティの“プロセス名”に“"UiPath.Studio"”とプロセス名を指定するだけです。

 これで、ワークフローを起動すると、瞬間で「UiPath Studio」が終了します。

「プロセスを強制終了」を配置し、プロパティに終了するプロセス名を指定する

プロセスを探して終了する

 目的は達成できたのですが、あまりにもシンプルすぎるので、もう少し、手を加えてみましょう。

 上記のワークフローでは、プロセスを取得し、そこから「UiPath」という文字列を含むプロセスを抽出し、そのプロセスだけを連続で強制終了しています。

 ワークフローのポイントを解説しましょう。注意が必要なのは次の2点です。

繰り返し(コレクションの各要素)

 このアクティビティを使うときは、常にプロパティの“TypeArgument”に注意してください。今回は、取得したプロセスをそのまま扱うので“System.Diagnostics.Process”を選択します。標準の“Object”のままでも途中までは問題ありませんが、“item.ProcessName”と呼び出せなくなるので注意しましょう。

条件分岐の“Condition”

 条件分岐のConditionでは、プロセス名に“UiPath”を含む場合を探し出します。こうした文字列が含まれるかどうかをチェックするときは“Contains”を使います。itemは、プロセスの一覧(“procList”)の中のひとつずつの要素です。この要素に対して、“.ProcessName”で名前を取得し(“TypeArgument”に注意)、“.Contains("UiPath")”で“UiPath”という文字列が含まれるかどうかを判断しています。

 なお、UiPathに関連するプロセスは、環境によって違いますが、おそらく多くの場合、次の4つがあります。

  • UiPath.Studio
  • UiPath.Agent
  • UiPath.Executor
  • UiPath.Service.UserHost

 実は、“UiPath.Studio”が最初に検出されるので、結果は先の“プロセスを強制終了”単体の場合と同じです。探して、繰り返し処理をする間もなく、途中で強制終了します。

 しかし、人間には一瞬に見える時間の中で、強制終了へのステップをひとつずつ刻んでいきながら、その途中で終了するというあたりに、少し情緒を感じるのです。

 いやあ、ロボットっていいですね。