はじめに
Blue Prism から外部のコマンドラインユーティリティを叩くために、Utility - Environment::Start Process Read Stderr and Stdout
など利用するシーンがあると思いますが、その際の引数にスペースやダブルクオート"
、バックスラッシュ\
が入っていたりすると、cmd.exeのエスケープが複雑すぎて制御不能になることがありました。
本記事は、上記問題を以下の方法で回避することができる、という小ネタです。
- 外部のコマンドライン側をwrapして、jsonファイルに書かれた引数を読むようにする
- Blue Prism 側で一時ファイルを作成し、コレクションで作成した引数を jsonファイルとして書き込む
- Blue Prism 側から、json形式の一時ファイルを引数として、外部コマンドラインを
Utility - Environment::Start Process Read Stderr and Stdout
経由で実行する - Blue Prism 側で一時ファイルを消す
実装の手順
Blue Prism 側で一時ファイルを作成するオブジェクトを準備する
Path.GetTempFileName メソッド というメソッドがあるので、それを叩くオブジェクトを作成します。
65535 を超えるファイルを作成しようとした場合に、 IOException をスローします
上記制限があるので、使い終わった後は必ず消すように、Blue Prism 側でのハンドリングが必要ですね。
オブジェクトスタジオの初期化ページでコードオプション を下記のように設定します。
コードステージの中身は1行です。
Collection で用意した引数を一時ファイルに書き込む
Utility - JSON::Collection to JSON
で渡したい引数をJSON文字列に変換します
Utility - File Management::Write Text File
で文字列を一時ファイルに書き込みます
呼び出されるコマンドユーテリティ側
python だとこんな感じです。
import sys
assert len(sys.argv) == 2, "引数にファイルパスを指定してください"
import json
with open(sys.argv[1], encoding='utf-8', mode="r") as f:
content = f.read()
params = json.loads(content)
# params は dict なので、params["param_name"] のように引数名のキーでパラメーターの値にアクセスできます
利用した一時ファイルを削除する
Utiliti - File Managment::Delete File
で一時ファイルを削除します。
65535 を超えるファイルを作成しようとした場合に、 IOException をスローします
上記の制限があるため、使い終わった一時ファイルは削除します。
以上の操作をまとめたプロセス
本来は例外発生時にも一時ファイルを削除するなどのハンドリングが必要かと思います。