LoginSignup
0
0

More than 1 year has passed since last update.

BluePrism から外部コマンドに複雑なパラメーターを渡す(cmd.exeのエスケープで困らないTips)

Posted at

はじめに

Blue Prism から外部のコマンドラインユーティリティを叩くために、Utility - Environment::Start Process Read Stderr and Stdoutなど利用するシーンがあると思いますが、その際の引数にスペースやダブルクオート"、バックスラッシュ\が入っていたりすると、cmd.exeのエスケープが複雑すぎて制御不能になることがありました。

本記事は、上記問題を以下の方法で回避することができる、という小ネタです。

  1. 外部のコマンドライン側をwrapして、jsonファイルに書かれた引数を読むようにする
  2. Blue Prism 側で一時ファイルを作成し、コレクションで作成した引数を jsonファイルとして書き込む
  3. Blue Prism 側から、json形式の一時ファイルを引数として、外部コマンドラインを Utility - Environment::Start Process Read Stderr and Stdout経由で実行する
  4. Blue Prism 側で一時ファイルを消す

実装の手順

Blue Prism 側で一時ファイルを作成するオブジェクトを準備する

Path.GetTempFileName メソッド というメソッドがあるので、それを叩くオブジェクトを作成します。

65535 を超えるファイルを作成しようとした場合に、 IOException をスローします

上記制限があるので、使い終わった後は必ず消すように、Blue Prism 側でのハンドリングが必要ですね。

オブジェクトスタジオの初期化ページでコードオプション を下記のように設定します。
code_option.jpg

コードステージの中身は1行です。

codestage.jpg

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 をスローします

上記の制限があるため、使い終わった一時ファイルは削除します。

以上の操作をまとめたプロセス

本来は例外発生時にも一時ファイルを削除するなどのハンドリングが必要かと思います。

sample_process.jpg

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0