Attended Robot과 Unattended Robot은 무인인점과, 아닌 점이 차이점.

 

방법은 작업 스케줄을 이용한다.

다른 방법들을 찾아봐도, forum이나 Stackoverflow 등등 에서도 다 똑같은 솔루션을 제시했다.

 

 

검색창에 '작업 스케줄러' 를 검색한 화면 !!

 

정말 그 작업 스케줄러일까? 했는데, 생각했던 그게 맞았다. (충격)

 

작업 스케줄러 메인 화면

 

작업 스케줄러를 실행하면 이런 화면이 나옴. 당황하지 말고 우측에 있는 [작업 만들기] 를 누름.

 

작업 만들기 화면

 

오케스트레이터를 사용해본 사람들은 대충 탭 이름만봐도 뭘 설정하는지 감이 옴 ㅎㅎ

트리거는 등록해놓을 작업을 어느 일시에 돌게 할 것인지 설정하는 탭일테고,

동작은 그 일시에 어떤 작업을 실행시킬지에 대한 탭일것이다.

나머지, 일반/조건/설정 탭에서는 동작시키려는 '작업'에 대한 권한 조정 등 세부적으로 조정할 수 있다.

 

먼저, 트리거를 들어가보자.

 

트리거 메인 화면

 

왼쪽 화면의 [새로 만들기] 버튼을 클릭하면 오른쪽 화면의 [새 트리거 만들기] 화면이 나온다.

오른쪽 [새 트리거 만들기] 에서 작업을 수행시키고자 하는 일시를 설정하여 저장하면, 왼쪽의 [트리거] 탭의 목록에 만들어진다.

 

 

이런식으로 다양하게 일자를 조정할 수 있다.

아래 사진처럼, 매월 단위에 일자별로도 선택해서 설정해줄수도 있다.

 

... 뭐, 그래서 일단 트리거는 이런식으로 설정하면, 시기에 맞춰 작업이 수행된다.

 

 

그럼 일시는 설정해두었다치고, 작업을 등록해서 사용해야하는 경우는 어떻게 해야할까?

[동작] 탭에 들어가서 설정해야한다.

동작 메인 화면

 

오호 이때부터 얼탔다. 뭐 어떻게 해야하는걸까 싶었는데, 사실 간단하다.

왼쪽의 화면에서 [새로 만들기] 버튼을 누르면 오른쪽 화면이 나온다.

[동작] 이라는 설정 옆에 드롭다운 형식으로 있는데, "프로그램 시작"은 말 그대로, 설정해둔 작업을 시작한다는 의미이다. (당연한 얘기를 당연하게 하는 이유는 역시 내가 친절보스이기 때문이다. ^^7)

 

중간에 보면, [프로그램/스크립트(p)] 라는 설정이 있는데, 보니까 파일을 등록하라고 한다.

여기에서는 2가지 방법이 있다. (나는 2가지만 알고 있기때문임)

1. .bat 파일 등록

2. Robot.exe 실행파일 등록 후 Main 파일 인수 설정

 

 

.bat 파일 생성 및 등록

 

* 배치 파일 : 명령 인터프리터에서 실행되게끔 코딩되어있는 파일

 배치 파일을 만드는 방법은 심플하다. 그냥 우리가 평소에 코딩할때랑 똑같이하면 됨.

 

메모장을 사용해도 괜찮고, 그냥 에디터 하나 켜서 코드를 넣고 빨간색 박스와 같이 .bat 확장자로 저장하면 된다.

배치 파일 내에 사용한 코드는 다 비슷하기 때문에 아주 잘 설명되어있는 아래 URL을 참고하자. ^^7

forum.uipath.com/t/bat/198585/5

 

Bat 파일 실행

안녕하세요 @smilepowers 님 제가 말씀드린 사항은 .xmal 파일은 스튜디오가 볼때 열리는 파일이고 로봇은 .nupkg 파일을 열어서 봇을 수행한다고 말씀드린건데 오해있으셨나봅니다. 저는 전달해주신

forum.uipath.com

 

저렇게 만들어진 .bat 파일을 등록하면 된다.

위의 참고글을 봐서 알겠지만, -file 인수까지 코딩해서 .bat 파일에 포함되기 때문에,

[새 동작 만들기] 에 인수나 추가적인 옵션을 입력하지 않아도 된다.

 

 

Robot.exe 실행파일 등록 후 Main 파일 인수 설정

 

이 방법은, UiPath Robot.exe 실행 파일을 등록하여

패키지로 추출한 Main 파일이나 Package를 인수로 설정하여 동작시키는 방법이다.

[작업 스케줄러] > [동작] > [새 동작 만들기]

 

위 사진에 있는 대로, Ui Robot.exe 실행 파일을 프로그램으로 등록한 후,

-file "살행하려는 .main 파일의 경로를 입력" 하면 된다.

 

프로그램 파일로 Ui Robot 을 등록하는 이유는

RPA를 실행하는 녀석은 Main.xaml이 아니라, UiProbot.exe 이기 때문이다.

Main.xaml은 그냥 RPA 스크립트일 뿐이고 실제 로봇이 동작하는것은 UiRobot이라는 것 !!

 

실제 입력해야하는 프로그램 경로나 인수에 대한 값 정보는 아래의 포스팅에 잘 기록되어있다.

 

참고 URL : charmingtree.tistory.com/5

 

[RPA/UIPATH] 윈도우 작업 스케줄러에 workflow 등록해서 원하는 시간에 자동 실행하기

윈도우에서 제공하는 "작업 스케줄러" 기능을 이용하여 uipath를 더욱 활용할 수 있는 방법을 포스팅 하겠습니다. 우선 "작업 스케줄러"에 등록할 자신만의 workflow를 준비해주세요. 저는 특정 시간

charmingtree.tistory.com

 

 

 

특수한 환경에서 개발해야하는 경우가 반드시 생긴다.

셀렉터도 안먹고, 그렇다고 해서 DT 스크래핑도, OCR도 정상적으로 돌아가는 것도 아니다.

다른 경우의 수가 다 먹히지 않는다면, Image를 이용해서 개발해야한다.

 

하지만, 예외 상황에 대한 경우의 수가 많아질 수 있고, 머신의 해상도나 배율이 개발PC 환경과 달라지면

............작동이 전혀 안될 수 있다................... ㅠㅠ ......................

그런 점을 유의해서 여러가지 상황에 대한 예외처리도 잘 하고 한다면 문제 없이 사용 할 수 있을 것 같다.

 

 

 

Image 관련 Activity

image 관련 activity

 

액티비티 이름만 봐도, 사용용도가 무엇인지, 어떻게 사용해야하는지 감이 오는.. ㅋㅋ

위 Image 관련 액티비티들을 보면 기존의 액티비티에서 사용하고 있는 것들이 많아서 사용용도는 똑같다고 보면 된다.

이러한 Image 액티비티를 사용하기 위해서는 속성 값을 잘 파악해두면 좋다.

 

 

Image Activity 속성

Image 액티비티와 관련 속성들

 

 

Image에 관련된 속성들을 보면 Input은 공통으로 가지고 있는 속성이다.

Image 액티비티에 있는 Input 공통 속성

 

속성 이름 설명
 Accuracy 이미지를 찾는데 정확성을 나타낸다.
속성 값의 범위는 0~1

1 로 작업할 경우, 잡아둔 이미지가 완전히 동일하지 않으면 인식하지 못한다 !!
기본값은 0.8이어서, 더 정확도를 높이고자 한다면 0.9 정도가 적당할 수 있다.
 Image 이미지 값을 설정하는 속성이다.
이미지 변수만 지원한다.
InArgument<Image>
 Profile ImageFindProfile.Basic
ImageFindProfile.Enhanced
이 속성에 대한 두가지 설정값이 있는데, Basic 은 기본 값으로 설정되어있다.

Basic을 사용하면 그냥 기본만큼 한다고 생각하면 되겠고,
Enhanced를 사용하면 리소스를 더 잡아먹으면서 디테일하게 잡는다..고...
UiPath Document에 나와있지만 써보면 그닥... 그냥 똑같던데 내가써서그런가

 

위의 속성값과 timeout 값을 잘 조절하다보면, 하나도 못잡던 것도 더 정확하고 빠르게 잡을 수 있게 된다.

예를 들어서, 정확도를 약간 높이면서 timeout 시간을 짧게 설정하고 retryscope를 돌리면서 말이다.

그러면 실행하는 동안에 여러번 수행을 하면서 보다 정확하게 에러가 나지 않고 잡을 수 있게 된다.

 

 

정해진 영역 내에서 Image 잡아오기

Indicate Scope on Screen 설정

 

저건 내가 잡아오려는 Image를 찾을 범위를 설정해준다.

최대한 이미지를 잘 잡을 수 있도록 범위를 설정해두고 그 안에서 찾는다면, 더 효과적으로 엘리먼트를 찾을 수 있다.

 

 

 

그래도.. 되도록이면 Image 안쓰는 방향으로...!

 

** 참조 URL

https://docs.uipath.com/activities/docs/ui-automation-ui-automation

 

 

모듈을 테스트 하던 중에 에러가 났다.

변수에 값이 들어가지 않아 연산을 할 수 없다는 에러였다.

그래서 Null 값이 들어가는 에러가 발생한다고 말씀드렸는데,

Nothing 이어도 그러냐고 하셔서 그렇다고는 했지만 머릿속에서는 그게 뭔 소리야 물음표 백만개를 그렸다.

그리고 깨닫게 되었다.

 

Null과 Nothing은 다른 개념이구나.........

 

* 참조 URL (다음의 글들을 참고 했습니다.)

http://blog.naver.com/PostView.nhn?blogId=rosa0189&logNo=60133624819

 

(101) "", Empty, Nothing, Null, vbNullChar, vbNullString, Missing 차이점 (엑셀 VBA 매크로)

"", Empty, Nothing, Null, vbNullChar, vbNullString 등의 차이점이 궁금하여 구글로 찾아보다가 ...

blog.naver.com

https://stackoverflow.com/questions/23130320/what-is-the-difference-between-vbnullstring-string-empty-and

 

What is the difference between vbNullString, String.Empty and ""?

All of these txtUsername.Text <> vbNullString txtUsername.Text <> String.Empty txtUsername.Text <> "" seem to return the same result. So, what's the difference between vbNullStr...

stackoverflow.com

 

 

 

간단히 요약해보자면 다음과 같다.

"" length 가 0인 값 (메모리 개념에서는 6 byte 할당됨. 값 존재)
Empty 객체는 존재하되, 초기화 하지 않은 상태. 변수는 존재하지만 아무것도 대입하지 않음.
Nothing 객제 참조를 삭제
Null 알 수 없는 값. 아무것도 참조 하지 않는 값.
vbNullChar 값이 0인 문자
vbNullString 메모리가 할당되지 않은 값이 0인 문자열
Missing 누락

 

 

 

일단 사실대로 말하자면, 누가봐도 닷넷에서 긁어왔당.

그리고 더 찾아보니까 더 많은 유형의 Exception이 존재했다.

각 Exception의 발생 조건에 관하여서는 각 링크로 가면 볼 수 있다.

 


 

Microsoft.Build.BuildEngine.InternalLoggerException

Microsoft.Build.BuildEngine.InvalidProjectFileException

Microsoft.Build.BuildEngine.InvalidToolsetDefinitionException

Microsoft.Build.BuildEngine.RemoteErrorException

Microsoft.Build.Exceptions.BuildAbortedException

Microsoft.Build.Exceptions.InternalLoggerException

Microsoft.Build.Exceptions.InvalidProjectFileException

Microsoft.Build.Exceptions.InvalidToolsetDefinitionException

Microsoft.Build.Framework.LoggerException

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException

Microsoft.Extensions.CommandLineUtils.CommandParsingException

Microsoft.Extensions.Options.OptionsValidationException

Microsoft.JScript.CmdLineException

Microsoft.JScript.ParserException

Microsoft.VisualBasic.ApplicationServices.CantStartSingleInstanceException

Microsoft.VisualBasic.ApplicationServices.NoStartupFormException

Microsoft.VisualBasic.Compatibility.VB6.WebClassContainingClassNotOptional

Microsoft.VisualBasic.Compatibility.VB6.WebClassCouldNotFindEvent

Microsoft.VisualBasic.Compatibility.VB6.WebClassNextItemCannotBeCurrentWebItem

Microsoft.VisualBasic.Compatibility.VB6.WebClassNextItemRespondNotFound

Microsoft.VisualBasic.Compatibility.VB6.WebClassUserWebClassNameNotOptional

Microsoft.VisualBasic.Compatibility.VB6.WebClassWebClassFileNameNotOptional

Microsoft.VisualBasic.Compatibility.VB6.WebClassWebItemNotValid

Microsoft.VisualBasic.Compatibility.VB6.WebItemAssociatedWebClassNotOptional

Microsoft.VisualBasic.Compatibility.VB6.WebItemClosingTagNotFound

Microsoft.VisualBasic.Compatibility.VB6.WebItemCouldNotLoadEmbeddedResource

Microsoft.VisualBasic.Compatibility.VB6.WebItemCouldNotLoadTemplateFile

Microsoft.VisualBasic.Compatibility.VB6.WebItemNameNotOptional

Microsoft.VisualBasic.Compatibility.VB6.WebItemNoTemplateSpecified

Microsoft.VisualBasic.Compatibility.VB6.WebItemTooManyNestedTags

Microsoft.VisualBasic.Compatibility.VB6.WebItemUnexpectedErrorReadingTemplateFile

Microsoft.VisualBasic.CompilerServices.IncompleteInitialization

Microsoft.VisualBasic.CompilerServices.InternalErrorException

Microsoft.VisualBasic.FileIO.MalformedLineException

Mono.Security.Interface.TlsException

System.AggregateException

System.ApplicationException

System.InvalidTimeZoneException

System.SystemException

System.TimeZoneNotFoundException

System.Activities.InvalidWorkflowException

System.Activities.VersionMismatchException

System.Activities.WorkflowApplicationException

System.Activities.DynamicUpdate.InstanceUpdateException

System.Activities.ExpressionParser.SourceExpressionException

System.Activities.Expressions.LambdaSerializationException

System.Activities.Presentation.Metadata.AttributeTableValidationException

System.Activities.Statements.WorkflowTerminatedException

System.AddIn.Hosting.AddInSegmentDirectoryNotFoundException

System.AddIn.Hosting.InvalidPipelineStoreException

System.ComponentModel.Composition.CompositionContractMismatchException

System.ComponentModel.Composition.CompositionException

System.ComponentModel.Composition.ImportCardinalityMismatchException

System.ComponentModel.Composition.Primitives.ComposablePartException

System.ComponentModel.DataAnnotations.ValidationException

System.ComponentModel.Design.ExceptionCollection

System.Composition.Hosting.CompositionFailedException

System.Configuration.SettingsPropertyIsReadOnlyException

System.Configuration.SettingsPropertyNotFoundException

System.Configuration.SettingsPropertyWrongTypeException

System.Configuration.Provider.ProviderException

System.Data.Linq.ChangeConflictException

System.Diagnostics.Eventing.Reader.EventLogException

System.Diagnostics.Tracing.EventSourceException

System.DirectoryServices.ActiveDirectory.ActiveDirectoryObjectExistsException

System.DirectoryServices.ActiveDirectory.ActiveDirectoryObjectNotFoundException

System.DirectoryServices.ActiveDirectory.ActiveDirectoryOperationException

System.DirectoryServices.ActiveDirectory.ActiveDirectoryServerDownException

System.DirectoryServices.Protocols.DirectoryException

System.IdentityModel.AsynchronousOperationException

System.IdentityModel.RequestException

System.IdentityModel.Metadata.MetadataSerializationException

System.IdentityModel.Protocols.WSTrust.WSTrustSerializationException

System.IdentityModel.Selectors.CardSpaceException

System.IdentityModel.Selectors.IdentityValidationException

System.IdentityModel.Selectors.PolicyValidationException

System.IdentityModel.Selectors.ServiceBusyException

System.IdentityModel.Selectors.ServiceNotStartedException

System.IdentityModel.Selectors.StsCommunicationException

System.IdentityModel.Selectors.UnsupportedPolicyOptionsException

System.IdentityModel.Selectors.UntrustedRecipientException

System.IdentityModel.Selectors.UserCancellationException

System.IdentityModel.Services.AsynchronousOperationException

System.IdentityModel.Services.FederatedAuthenticationSessionEndingException

System.IdentityModel.Services.FederationException

System.IdentityModel.Services.WSFederationMessageException

System.IO.IsolatedStorage.IsolatedStorageException

System.IO.Log.SequenceFullException

System.Management.Instrumentation.InstrumentationBaseException

System.Management.Instrumentation.WmiProviderInstallationException

System.Net.Http.HttpRequestException

System.Net.Mail.SmtpException

System.Net.PeerToPeer.PeerToPeerException

System.Reflection.Metadata.ImageFormatLimitationException

System.Runtime.AmbiguousImplementationException

System.Runtime.CompilerServices.RuntimeWrappedException

System.Runtime.DurableInstancing.InstancePersistenceException

System.Runtime.Remoting.MetadataServices.SUDSGeneratorException

System.Runtime.Remoting.MetadataServices.SUDSParserException

System.Runtime.Serialization.InvalidDataContractException

System.Security.RightsManagement.RightsManagementException

System.ServiceModel.Channels.InvalidChannelBindingException

System.Text.Json.JsonException

System.Threading.BarrierPostPhaseException

System.Threading.LockRecursionException

System.Threading.Tasks.TaskSchedulerException

System.Web.Query.Dynamic.ParseException

System.Web.Security.MembershipCreateUserException

System.Web.Security.MembershipPasswordException

System.Web.UI.ViewStateException

System.Web.UI.WebControls.EntityDataSourceValidationException

System.Web.UI.WebControls.LinqDataSourceValidationException

System.Windows.Automation.NoClickablePointException

System.Windows.Automation.ProxyAssemblyNotLoadedException

System.Windows.Controls.PrintDialogException

System.Windows.Forms.AxHost.InvalidActiveXStateException

System.Windows.Xps.XpsException

System.Windows.Xps.XpsWriterException

System.Workflow.Activities.Rules.RuleException

System.Workflow.ComponentModel.WorkflowTerminatedException

System.Workflow.ComponentModel.Compiler.WorkflowValidationFailedException

System.Workflow.ComponentModel.Serialization.WorkflowMarkupSerializationException

System.Workflow.Runtime.WorkflowOwnershipException

System.Xaml.XamlException

Windows.UI.Xaml.LayoutCycleException

Windows.UI.Xaml.Automation.ElementNotAvailableException

Windows.UI.Xaml.Automation.ElementNotEnabledException

Windows.UI.Xaml.Markup.XamlParseException

 

 

 

ref : https://docs.microsoft.com/ko-kr/dotnet/api/system.exception?view=netframework-4.6.1#definition

 

Exception 클래스 (System)

응용 프로그램을 실행하는 동안 발생하는 오류를 나타냅니다.Represents errors that occur during application execution.

docs.microsoft.com

 

 

엑셀이나 기타 응용 소프트웨어로 작업하다가 실행시키면

백그라운드 프로세스나, 현재 사용중인 소프트웨어의 충돌로 에러가 날 수 있는데,

이에 대하여 백그라운드 프로세스에 어떤 것이 있는지 확인하면 미리 예외 처리를 할 수 있다.

(예를 들어 엑셀이라던가... 엑셀이라던가... 엑셀이라던가...)

 


이런식으로 Process.~ 에서는 다양한 프로세스에 관련된 메서드를 확인할 수 있다.

Kill Process로 백그라운드 프로세스를 종료시키는 방법이 아니더라도

Throw 같은 액티비티로 에러를 주거나, Add Log Field 액티비티로 로그를 출력할수도 있다.

 

** Add Log Fieldhttps://forum.uipath.com/t/add-log-field/5496

 

Add log field

Hi All, Could anyone explain about add log field activity.Please don’t direct me to the activities guide. Regards, Rahul

forum.uipath.com


** 관련 URL

https://forum.uipath.com/t/check-if-excel-process-is-open-and-close/224619

 

Check if excel process is open and close

Hello everybody, I need to check if excel is currently open and if true, end it. I use get processes (output= “currentProcess”) to check all processes and then use an if activity with this condition: Process.ToString.Contains(“EXCEL”) Unfortunately

forum.uipath.com

 

 

데이터를 처리해줄때마다 한 줄 씩, 한 셀 씩 입력해야한다.

한번에 쓰려고 했었는데 그러면 중간에 어떤 데이터가 누락되었는지 알 수 없기 때문이다.

번거로워도 한 줄 씩 입력해줘야한다.

Write cell이나 Write Range는 세로 방향으로 써내려가기 때문에 못쓰고...

결국 가로로 한 셀씩 이동하면서 쓰는 것을 직접 짜게 되었다.

그러기 위해서는 컬럼의 인덱스, 즉 A B C D E... 같은 것들을 구해야하는데

그러기 위해서는 아스키코드를 활용해야한다.

 

출처 https://enter.tistory.com/49

 

보다시피 내가 사용해야하는 알파벳 대문자는 A 65부터 Z 90까지의 숫자이다.

포럼을 돌아다니다가 엄청난 플로우를 발견했다.

https://forum.uipath.com/t/write-data-horizontaly-in-excel/19413

 

Write data horizontaly in excel

Hu guys, can anybody solve my problem. I use extract data to extract a structured data of single column with 3 values. when i normally use write range it writes the data to A1 column What i want to do is to write that three entries in cell A1 B1 C1. i.e. h

forum.uipath.com

답변해주신 분이 쿨하게 플로우만 남기고 사라지셨다...

설명을 요구하는 질문자의 답글을 보면서 아 그러게 왜 이걸 답 안해주지 했는데 ㅋㅋ 결국 내가 이해함..

 

 

이 플로우는 결국 컬럼의 인덱스 문자를 얻기 위한 플로우이다.

ColumnName은 나중에 WriteCell에서 다음과 같이 응용될 수 있다.

ColumnName.Trim + "1".toString A1, B1, C1 ···
ColumnName.Trim + (oldDT.Rows.Count+1).toString 이 두가지 표현식은 내가 읽어온 DT의 마지막줄 다음부터 입력하는 표현식이다.
(Read 할때, Haeder가 있으면 +2, 없으면 +1)
ColumnName.Trim + (oldDT.Rows.Count+2).toString

 

1) modulo = (columnNumber-1) mod 26

modulo 는 아스키 코드로 표현하기위해 65에 더할 숫자를 의미한다.

"/26" 을 해준 이유는, 알파벳이 26개라서 그렇다.

A는 아스키코드 10진수로서 표현하면 65인데 65부터 1씩 더할수록 B, C, D, E ··· 점차 진행된다.

그 1씩 더하는 것을 표현한 것이 modulo 이다.

columnNumber가 3이면 65+2 이니까 C가 된다. 이처럼 알파벳 26가지의 숫자를 표현할 수 있는 조건을 생성한다.

 

2) columnName = Conver.ToChar(65+modulo).toString 

이런 식으로 표현해주면 숫자를 아스키코드로 인식하기 때문에 알파벳 대문자로 반환한다.

궁금해서 그냥 CChar(65+1) 을 해봤는데 그럼 오류가 난다.

아스키코드로 할건지, 아님 정말 문자열로 표현할건지 명확하게 해달라고 에러문이 뜬다.

 

3) Convert.ToInt32((columnNumber - modulo) / 26)

columnNumber를 0으로 초기화해주는 표현식이다.

 

 

뭐 이런 식으로 하면... 컬럼 인덱스를 VB 코드 없이 구할 수 있다.

포럼에 검색해보니 컬럼 인덱스를 구하기 위해서 VB 코드만 주는걸 보았는데...

꼭 그런 방법이 아니더라도 플로우로 구현할수도 있었다.

invoke Code나 Invoke VBA는 오류가 있을 수 있으니 ㅎㅎ

* 참고 URL : https://forum.uipath.com/t/featureblog-18-3-library-reusable-components/62746

 

#FeatureBlog - 18.3 - Library (Reusable components)

First, big thanks to @MirceaGrigore who has helped put this in place. Today’s topic: Library (Reusable components). What is it? A Library is a collection of reusable components. A reusable component is a workflow that can be compiled and packaged as an a

forum.uipath.com

 

 

어느정도 UiPath를 하다가보면 필요한 액티비티가 없을때, 패키지를 찾아보곤한다.

그럴때마다 들어가는게 Manage Packages, 패키지 관리 !

 

Manage Packages를 들어가면 제일 먼저 나오는 화면

 

기존의 액티비티를 잘 활용하는 것이 좋고, 정말 필요한 경우가 아니라면 무조건 패키지를 받아 쓰는건 권하지 않는다.

나는 UiPath 정규 패키지 중에서 필요한 것들만 골라서 쓰는 편인데,

가끔 플로우 짜면서 애먹다가 패키지 한 번 다운받아서 쓸 때 속이 편안해진적이 많다 ㅋㅋㅋ

그러면서 나도 이런 패키지를 만들어서 써보고 싶다는 생각도 들었는데,

포럼을 돌아다녀보니 Custom Activity는 Visual Studio를 사용해서 코딩하는게 대부분인 것 같아서 얼른 포기했다.

 

그런데 필드에 나오면서 플로우의 재사용이 안되는게 이렇게 짜증나고 복잡하게 만드는 일인 줄 몰랐고...ㅠ

그러다가 Library를 접하게 되었다.

 

Library를 이용해 간단한 나만의 액티비티를 만들 수 있었다

 

UiPath Studio를 열었을때의 초기화면, Library를 만나볼 수 있다.

 

처음에 Studio를 열면 이런 초기화면이 나오는데, Library 프로젝트를 빌드한다.

 

내가 이제부터 만들 액티비티가 수행할 시나리오는 다음과 같다.

  1. 엑셀 프로그램을 사용하지 않고, 백그라운드로 실행하는 것으로 가정한다.
  2. 엑셀 파일을 켠다
  3. 엑셀 파일에 쓰여진 데이터를 읽는다.
  4. 쓰여진 데이터 다음 줄 부터 새로운 데이터를 다시 쓴다.

그렇게 다음과 같은 플로우를 짰다.

 

NewActivity.xaml
0.01MB

 

이제 이 플로우를 액티비티로 만들어야하는데, 이제 만든 플로우를 Publish 하면 된다.

UiPath Studio 리본에 보면 Publish가 있다.

 

알맞은 액티비티 이름을 설정해준 뒤, 저장할 URL을 설정해준다.

 

 

여기서 Publish를 하면 라이브러리는 누겟 파일로 다음과 같이 만들어진다.

 

 

 

자, 그럼 이제 다음으로 내가 만든 Library를 불러와 액티비티를 사용해보자!

 

 

먼저 라이브러리를 불러올 아무개 Process를 하나 만들어줬다.

다음으로, Manage Packages에 들어가 Settings에 들어가서

방금전 라이브러리 누겟을 저장한 경로 Source에, 패키지 이름을 Name에 지정해 추가해준다.

 

나는 이런 식으로 추가해줬는데,

자세히보면 좌측 메뉴 박스에 내가 추가해준 패키지 소스가 들어있는 것을 확인할 수 있다. (빨간색 네모 박스)

들어가보면 내가 만들어준 라이브러리가 올려져있다.

다른 패키지를 사용하는 방법과 동일하게 Save 하면, 다음과 같은 액티비티가 생성되어있는 것을 확인할 수 있다.

 

 

Properties를 보면 Input의 속성들을 제시해준 것을 볼 수 있다.

이는 처음 플로우를 짤 때, 그 변수 값들을 인수로 사용해줬기 때문이다.

 

이렇게 하면 라이브러리를 이용해 패키징하여 간단한 커스텀 액티비티를 만들 수 있다 ㅎ

 

 

 

UiPath Robot 이름이 계속 바뀌더니 결국은 Assistant가 되었구나..........

오케스트레이터에 업데이트가 있었더니 연동하는것도 여러모로 어려움이 있었다.

하지만 제대로 도움받을 수 있는 곳은 별로 없었다....ㅠ 그래서 적는 포스팅....

 

 

0. 일단 Assistant 를 켜줍니다.

uipath studio를 설치하면 동시에 자동적으로 같이 uipath assistant가 설치됩니다.

우측 사진이 Assistant 화면 입니다

오케스트레이터 셋팅을 해야하는데. 상단의 톱니바퀴 모양을 클릭하면 Oechestrator Settings가 있습니다.

들어가면 다음과 같은 화면을 볼 수 있습니다.

Oechestrator Settings 화면

 

1. Orchestrator와 내 컴퓨터 연동하기

1) 서비스 관리 페이지 접속하기

https://www.uipath.com/ 에서 상단의 Try UiPath Free 를 누르고 로그인(및 회원가입)을 하면 볼 수 있는 화면이다.

초록색 부분 = 오케스트레이터 서비스명

서비스명을 클릭하면 다음과 같은 오케스트레이터 메인 페이지에 들어갈 수 있다.

오케스트레이터 메인 화면. (개인정보는 지웠습니다)

 

2) 머신 생성하기

머신이란 사용할 물리적 PC를 말합니다.

좌측에 스크롤을 맨 아래로 내리면 MANAGEMETN에 Machine이 있다.
오케스트레이터의 Machine 화면. 이곳에서 Machine을 관리할 수 있다.

파란색 +를 눌러 머신을 추가합니다.

그럼 다음과 같은 생성창을 볼 수 있습니다. 기입할 내용은 다음과 같습니다.

Machine 이름은 자유입니다. (Assistant에 있는 Machine Name을 가져다 쓰는게 초심자의 심신건강에 좋습니다.)

 

다음으로, 생성한 Machine의 Key를 가져와 UiPath Assistant에 셋팅해야합니다.

머신키를 복사해서 (초록색 버튼) Assistant의 Machine Key 에 붙여넣습니다.

자, 그럼 Orchestrator URL만 채우면 되겠네요. 간단합니다.

현재 있는 오케스트레이터 페이지의 주소창을 봅시다.

만약 나의 주소창에

https://cloud.uipath.com/h~~~/서비스이름/machines/~~~~~~~~~~~~~~~~

이라면 서비스명/ 까지 복사해서 붙여넣어주면 됩니다.

https://cloud.uipath.com/h~~~/서비스이름/   ← 이런식으로.

 

Connect 를 눌러주면 다음과 같은 상태를 볼 수 있습니다.

 

이 상태에 대해서 자세한 설명이 없어서 힘들었는데 ㅠㅠ

알고보니, 이런 의미였습니다.

Orchestrator에 등록된 Machine과 실제 Machine이 연결되었지만,

로봇은 연결되지 않았다.

 

그럼 다음으로 로봇을 생성해서 연결해보겠습니다.

로봇을 연결하기 위해서는 정확한 머신의 userName을 입력해서 만들어놓기만 하면 됩니다.

 

 

2. 내 컴퓨터에 오케스트레이터에 등록된 Robot 연동하기

1) 환경(Environment) 생성하기

2) 로봇 생성하기

3) 환경에 로봇을 업데이트하기

 

 

 

 

+ Recent posts