昔はタスクスケジューラで起動出来てたらしいけど、今はもう出来なくなった様なのでサクッと作って見た。
やりたい事
毎朝6時にUiPathで作成したRPAを実行したいだけ。WinActerはタスクスケジューラでキック出来てたので、
UiPathも行けると思い込んでたがどうやら駄目らしい。
例えば間にスクリプト挟んだりVBA経由させたり等色々やったけども、
スタートがタスクスケジューラ始動の時点でダメな模様。
これ出来ないとRPAの意味全く無くなってしまうので何とかする事に。
アプリを作って見た
ある程度の汎用性は持たせたかったので、UiPathのxamlをキックするバッチファイルを予め作成し、
そのバッチを指定した時間に実行する仕様としてみた。
実行したいRPAが増えた場合とかの拡張性は一旦完全にスルー。。。
以下ソース全文
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace BatKicker
{
public partial class Form1 : Form
{
Boolean bPicFlg;
public Form1()
{
InitializeComponent();
timer1.Enabled = true;
// サイズ固定にする
this.FormBorderStyle = FormBorderStyle.FixedSingle;
// 最大化・最小化の無効
this.MaximizeBox = false;
this.MinimizeBox = false;
// デフォルト停止状態
System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
Bitmap bmp = new Bitmap(myAssembly.GetManifestResourceStream("BatKicker.停止中.png"));
pictureBox1.Image = bmp;
bPicFlg = true;
}
/****************************************************************************/
/* */
/* 再生/停止クリック時処理処理 */
/* */
/****************************************************************************/
private void pictureBox1_Click(object sender, EventArgs e)
{
System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
// 停止状態なら実行状態にする
if (bPicFlg == true)
{
Bitmap bmp = new Bitmap(myAssembly.GetManifestResourceStream("BatKicker.再生中.jpg"));
pictureBox1.Image = bmp;
bPicFlg = false;
}
// 実行状態なら停止状態にする
else
{
Bitmap bmp = new Bitmap(myAssembly.GetManifestResourceStream("BatKicker.停止中.png"));
pictureBox1.Image = bmp;
bPicFlg = true;
}
}
/****************************************************************************/
/* */
/* ディレクトリボタンクリック時処理処理 */
/* */
/****************************************************************************/
private void Btn1_Click(object sender, EventArgs e)
{
string strpath = "";
//ファイルダイアログを生成する
OpenFileDialog op = new OpenFileDialog();
op.Title = "Kickさせたいバッチファイルを指定してください";
op.InitialDirectory = @"C:\";
op.Filter = "バッチファイル(*.bat)|*.bat";
op.FilterIndex = 1;
//オープンファイルダイアログを表示する
DialogResult dialog = op.ShowDialog();
//「開く」ボタンが選択された時の処理
if (dialog == DialogResult.OK)
{
strpath = op.FileName;
//テキストボックスにパスを表示
textBox1.Text = strpath;
}
}
/****************************************************************************/
/* */
/* タイマー起動時処理 */
/* */
/****************************************************************************/
private void timer1_Tick(object sender, EventArgs e)
{
// 実行状態の場合
if (bPicFlg == false)
{
// 現在時刻が実行時刻の場合
if (dateTimePicker1.Value.ToShortTimeString() == System.DateTime.Now.ToShortTimeString())
{
// プロセス起動情報
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/c ";
startInfo.Arguments += textBox1.Text;
// バッチファイル実行
var proc = Process.Start(startInfo);
}
}
}
}
}
本当にこれだけ。
タイマー貼って合って、実行モード(上の画像の状態)の場合は時間になったら指定されたパスのバッチを実行するってだけのデスクトップアプリ。
ここからダウンロードも出来るのでご自由にどうぞ。
バッチファイルは書き方に注意
最初にバッチファイル単体で叩いてちゃんと動くか確認しましょう。困った事にUiPathはバージョンによって書き方がかなり変わるので注意が必要。
自分のバージョンStudioX 21.6.0-beta4514だと以下の記載方法で行けます。
※ユーザ名やRPA置いてる場所は環境に合わせてください
"C:\Users\user\AppData\Local\UiPath\app-21.6.0-beta4514\UiRobot.exe" execute --file "C:\Users\user\Desktop\RPA\Main.xaml"
これで上手く行かないバージョンの場合はexecute消したり頭にcall付けたり等色んなパターン有るので足搔いてみましょう。その内出来ます(ᵔᴥᵔ)
コメント
こんにちは。
UiPathの自動実行で躓いています。
現象としては、batファイルを手動で実行した場合は、何度実行しても失敗亡く実行されますが、タスク登録後、長時間経過後にbatファイルが実行された場合、batファイル自体は実行され一瞬 コマンドプロンプトまでは立ち上がりますが、すぐに消えてUiPathにて作成したプログラムが実行されずに閉じてしまいます。
にわかSEの備忘録さまの作られたプログラムで実行しても同様でした。
私もVBにて同様のアプリを作ってみましたが、同じ現象となりました。
感覚的にですが、Robotサービスがしばらく使用していないと待機状態となっていて、batファイルを起動したタイミングでは、まだ立ち上がっていない状態のため、先に進めないのでは?と考えております。
もし、同様の現象を体験しており、何か対策をされているようであれば相談させていただきたくメッセージさせていただきました。
他にも以下のURLのように同様の現象の方がおられましたので、URLを記載させていただきます。
https://forum.uipath.com/t/uipath-robot/179877