Automation Anywhere A2019 PowerShell連携による独自の入力フォーム呼び出し

Automation Anywhere

対話型のBotを作成するとき、入力を受け付ける手段としては「プロンプト」パッケージが用意されています。入力項目が少ない場合であれば、「プロンプト」パッケージでもいいのですが、入力項目が増えてくると独自の入力フォームが欲しくなることがあります。また、入力項目にパスワードがあるような場合、「プロンプト」パッケージの[Mask keystroke]機能が イマイチ なので、断然、独自の入力フォームが欲しくなります。
ここでは、Windows Formを表示して入力を受け付けるPowerShellスクリプトをBotから実行して、入力内容を取得する処理を紹介します。

処理の分担とデータ入出力の流れ

Task BotとPowerShellスクリプトの処理分担と、データがどのように流れるかを下図に示します。

ここで紹介しているBotのデモ動画は こちら で参照できます。

PowerShellスクリプトのアップロードとパス定義手順

ここでは、Control RoomにアップロードしたPowerShellスクリプトを実行する仕様にしたいので、まず、PowerShellスクリプトをControl Roomにアップロードする手順を説明します。

PowerShellスクリプトのアップロード

ローカルフォルダに作成したPowerShellスクリプトファイル「PSS_000101_InputMemberInformation.ps1」をControl Roomにアップロードします。
PowerShellスクリプトファイルのアップロード先フォルダとして、あらかじめ「Bots\Blog\Script\Script_PowerShell」を作成しています。(フォルダの作成手順は省略します。)

[ファイルをアップロード]ボタンをクリックします。

[ファイルを追加]ボタンをクリックします。

ローカルフォルダに作成したPowerShellスクリプトファイルを選択して[開く]ボタンをクリックします。

[アップロード]ボタンをクリックします。

これでアップロードは完了です。

パス定義

Control RoomにアップロードしたPowerShellスクリプトへのパスをファイル型変数に設定します。

[変数を作成…]ボタンをクリックします。

[名前]、[タイプ]を入力したら、[デフォルト値]に[Control Roomファイル]を選択して、[参照]ボタンをクリックします。

Control Roomのフォルダを展開して該当ファイルを選択して、[確認]ボタンをクリックします。

これで変数定義は完了です。

Task Botの作成

アクションリストの全体概要

下記がアクションリストの全体概要です。PowerShellスクリプトの呼び出しには、「Python script」パッケージを利用しています。アクションの詳細設定内容については、(2)以降で、「Python script」パッケージのアクション(5, 7行目)のみに限定して説明します。

Pythonスクリプトをインラインで定義

「Python」パッケージの「Open」アクション

【詳細設定】
[Manual input]を選択して、[Enter script here]に関数「inputProfile」を定義しています。筆者の環境にはPython2.7をインストールしているので、[Python runtime version]は「2」を選択しました。

【Pythonスクリプト詳細】

関数「inputProfile」は、引数「ScriptFilePath」でPowerShellスクリプトへのパス情報を受け取る仕様にしています。

def inputProfile(ScriptFilePath):
  import subprocess
  cmd = "powershell.exe -ExecutionPolicy RemoteSigned  -WindowStyle Hidden -nologo -File \"" + ScriptFilePath + "\""
  result = subprocess.call(cmd, shell=True)

 

Pythonスクリプトの関数実行

「Python」パッケージの「Execution function」アクション

【詳細設定】
[Enter name of function to be executed]に関数名「inputProfile」、[Arguments to the function]にファイル型変数「F_PSS_000101」を設定しています。

PowerShellスクリプト詳細

以下のコードで動作確認をしましたので、参考情報として掲載しておきます。

$OutputEncoding = [Text.Encoding]::Default
$wsobj = New-Object -ComObject wscript.shell

#Windows Formswをロードする。
Add-Type -AssemblyName System.Windows.Forms

#==================================================
#フォームに表示する項目要素を定義する。
#==================================================
#ツールのウインドウを定義する。
$form = New-Object System.Windows.Forms.Form
$form.Size = "400,300"
$form.StartPosition = "CenterScreen"
$form.Text = "会員情報入力"

#[会員番号]表示ラベルを定義する。
$Label_Id = New-Object System.Windows.Forms.Label
$Label_Id.Location = "10,10"
$Label_Id.Size = "60,30"
$Label_Id.Text = "会員番号:"

$Text_Id = New-Object System.Windows.Forms.TextBox
$Text_Id.Location = "80,10"
$Text_Id.Size = "200,30"
#クリップボードから取得した内容を設定する。
$Text_Id.Text = Get-Clipboard -Format Text
$Text_Id.Enabled = $False

#[パスワード]入力ボックスを定義する。
$Label_Pw = New-Object System.Windows.Forms.Label
$Label_Pw.Location = "10,50"
$Label_Pw.Size = "60,30"
$Label_Pw.Text = "パスワード:"

$Text_Pw = New-Object System.Windows.Forms.TextBox
$Text_Pw.Location = "80,50"
$Text_Pw.Size = "200,30"
$Text_Pw.Text = ""
$Text_Pw.PasswordChar = "*"

#[氏名]入力ボックスを定義する。
$Label_Name = New-Object System.Windows.Forms.Label
$Label_Name.Location = "10,90"
$Label_Name.Size = "40,30"
$Label_Name.Text = "氏名:"

$Text_Name = New-Object System.Windows.Forms.TextBox
$Text_Name.Location = "80,90"
$Text_Name.Size = "200,30"
$Text_Name.Text = ""

#[Email]入力ボックスを定義する。
$Label_Email = New-Object System.Windows.Forms.Label
$Label_Email.Location = "10,130"
$Label_Email.Size = "40,30"
$Label_Email.Text = "Email:"

$Text_Email = New-Object System.Windows.Forms.TextBox
$Text_Email.Location = "80,130"
$Text_Email.Size = "200,30"
$Text_Email.Text = ""

#[OK]ボタンを定義する。
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = "90,180"
$OKButton.Size = "75,30"
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK

#[キャンセル]ボタンを定義する。
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = "180,180"
$CancelButton.Size = "75,30"
$CancelButton.Text = "キャンセル"
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel

#==================================================
#フォームに項目要素を追加する。
#==================================================
$form.Controls.Add($Label_Id)
$form.Controls.Add($Text_Id)
$form.Controls.Add($Label_Pw)
$form.Controls.Add($Text_Pw)
$form.Controls.Add($Label_Name)
$form.Controls.Add($Text_Name)
$form.Controls.Add($Label_Email)
$form.Controls.Add($Text_Email)
$form.Controls.Add($OKButton)
$form.Controls.Add($CancelButton)

#キーにボタンコントロールを紐づける。
$form.AcceptButton = $OKButton
$form.CancelButton = $CancelButton

#フォームを際前面に表示するように設定する。
$form.Topmost = $True

#==================================================
#フォームを表示する。
#==================================================
#クリップボードに「Timeout」を設定する。
"TimeOut" | Clip
$result = $form.ShowDialog()

#==================================================
#ボタンをクリックしたときの処理を定義する。
#==================================================
#OKボタンが押された場合、入力値をクリップボードに出力する。
if ($result -eq "OK")
{
    $CRLF = "`r`n"
    $Text_Pw.Text + $CRLF + $Text_Name.Text + $CRLF + $Text_Email.Text | Clip
}else{
    #キャンセル]ボタンがクリックされた場合は、「Cancel」をクリップボードに出力する。
    "Cancel" | Clip
}

【余談】

今回は、subprocessモジュールを使ってPowerShellスクリプトを呼び出しましたので、実行したPowerShellが終了するまで7行目から次のアクションに進むことはありませんでした。