RPAエンジニアの雑記

RPA(Blue Prism)について色々記載してます。

(BluePrism)プロセスを任意のタイミングで実行させたい~Part3/2~

どうも、おむおむです。
テレワークなうです。
出勤時間がカットされるというだけで非常に有意義ですね。

さて、前回まででリソースPCに対して
HTTPから指示を行う方法について記載してきました。
newgraduate19-rpa.hatenablog.com
newgraduate19-rpa.hatenablog.com
今回は、これらを使ってバッチファイルを書いてみたいと思います。

%記号をエスケープする

ご存じの通り、バッチファイル内においては
%で囲まれた文字は変数として扱われます。

前回の記事で、URL内で半角スペースは%20
エンコードしてあげる必要があると説明しました。
ではバッチファイル内でどうやってエスケープするの!?バックスラッシュ!?
f:id:newgraduate19:20200416152449p:plain
for文を思い出していただきたい。
%は、%%のように2つ並べてあげることでエスケープできるのです!
読みづらくなるね!

curlコマンドでHTTPリクエス

curlコマンドを使用することで、お手軽?にHTTPリクエストを送ることができます。
オプションはめちゃくちゃ種類があるんですが、
今回はcurl -s <URL>で十分かと思われます。
これは進捗のゲージ(名前ド忘れした...)を非表示にするやつです。
大文字小文字区別されるので注意!

コマンド実行結果の戻り値を取得する

Linuxであればコマンドをバッククォートで囲むだけで
実行結果を変数に入れることができますが、
Windowsの場合はいちいちForコマンドで諸々せねばなりません。
大文字小文字もなぜか区別されないし、なんか独特ですよね。

で、実行結果を環境変数に格納するには
for /f "usebackq"というようにオプションを指定します。

使い方はコマンドプロンプトfor /?すればよいと思いますが、
一応下記のリンクも載せときます。
qiita.com

実行結果の特定の箇所を指定する

ここからちょっとややこしいです。
認可がAuthedになっているコマンドを使用する場合、
userpasswordコマンドを使用してユーザ名とパスワードを
他のコマンド実行前に指定する必要があります。

そのため、実行結果は以下のように複数行にわたります。

USER SET
USER AUTHENTICATED
<コマンドの実行結果>


ここで最終行の結果だけを環境変数に入れたい場合は、
for /f "skip=〇〇"というようにスキップする行数を指定します。

また、行内の特定のトークンを指定する場合は
for /f "tokens=〇〇"のように指定します。

例えば、createasコマンドを使用すると、
セッションIDが以下のような形式で返ってきます。

SESSION CREATED : <セッションID>

この場合、トークンは「SESSION」、「CREATED」、「:」、「セッションID」の
4つに分かれている、とカウントできます。
そのため、セッションIDの部分だけを環境変数に格納したい場合は
for /f "tokens=4"のように指定すると良きかと思います。

・・・長いよね、ごめんね。
f:id:newgraduate19:20200416150748p:plain

実際に書いてみた

ここまでの総まとめとして、実際にbatファイルを記述してみました!
いくらでも書きようはあると思いますが、
エラーハンドリング等々ある程度無視してますが、
一例としてご参考になれば幸いです!

@ECHO OFF
REM 変数宣言
SET base=http://<リソースPC名>:8181/
SET procid=<procidコマンドで取得したプロセスID>
SET userid=<useridコマンドで取得したユーザID>
SET sessionflg=false

REM ユーザのパスワード入力
SET /P pw=パスワードを入力してください。:
SET auth=%base%user%%20%userid%^&password%%20%pw%

REM リソースPCのセッション状況確認
FOR /F "skip=2 usebackq" %%i in (`CURL -s "%auth%&busy"`) do (
    SET isbusy=%%i
)

IF %isbusy% == USER (
    ECHO パスワードが違います。
    PAUSE
    EXIT
) ELSE IF %isbusy% == YES (
    ECHO ランタイムリソースに保留中もしくは実行中のセッションが存在します。
    PAUSE
    EXIT
)

:gettoken
REM 認証トークン取得
FOR /F "usebackq" %%j in (`CURL -s "%base%getauthtoken%%20%procid%%%20%userid%%%20%pw%"`) do (
    SET token=%%j
)

IF %sessionflg% == True (
    goto startp
)

REM セッション作成
FOR /F "skip=2 tokens=4 usebackq" %%k in (`CURL -s "%auth%&createas%%20%token%%%20%procid%"`) do (
    SET sessionid=%%k
)

SET sessionflg=True

goto gettoken

REM 開始指示
:startp 
FOR /F "skip=2 usebackq" %%l in (`CURL -s "%auth%&startas%%20%token%%%20%sessionid%"`) do (
    SET result=%%l
)

IF NOT %result% == STARTED (
    ECHO プロセスの開始指示ができませんでした。
    PAUSE
    EXIT
)


パスワードだけは実行者に入力してもらって、
実行端末は決め打ちにしてます。

また、今までの記事ではuser%20name%20<ユーザ名>としていましたが、
冗長になるのでuser%20<ユーザID>の形で指定しています。

そのほかにも諸々手を加えてみたので、
お暇な方は調べてみてください!

まとめ

コマンドプロンプトって便利(雑)

以上です!長くなりましたがお読みいただきアザス!
次は最近作ったおもちゃを紹介します。