[BluePrism] 프로세스 이름에서 프로세스 ID와 창 이름을 검색하는 객체를 작성했습니다.

이것을 쓴 이유



예를 들어, 여러 개의 브라우저가 열려 있다면 어떤 브라우저를 연결하여 처리에 사용할 것인가?
UiPath라면 브라우저 변수로 관리하면 좋지요.
그러나 Blue Prism에는 브라우저 변수가 없기 때문에, 어떻게 하자……라고 시행착오했을 때에 쓴 ​​것입니다.
꽤 전에 써서 사장하고 있었던 것이므로, 이쪽에 기록해 둘까…

프로세스 ID를 얻으려면



우선 프로세스 ID란 무엇인가(미안해 내가 레벨 낮기 때문에 거기에서입니다……)라고 하는 것은
프로세스 탐색기 (Microsoft)
라고 하는 것이 있어, 이것으로 상세한 프로세스명이나 프로세스 ID라든지 볼 수 있어 편리합니다.
이런 녀석

이것으로 보면, 같은 앱이나 브라우저가 복수 기동하고 있어도 프로세스 ID가 다르기 때문에, 프로세스 ID로 일의로 지정할 수 있는 것을 알 수 있습니다.

그 프로세스 ID를 얻는 것은
특정 exe의 PID를 얻는 방법에 대해 (teratail)

프로세스명으로부터 프로세스를 취득하는 것은
지정된 이름의 모든 프로세스를 가져옵니다.

코드 스테이지에서 컬렉션을 처리하는 방법
How to store data into a collection form string in Blue Prism(stackoverflow)

이것 속에 쓰여진 GetType이나 DataType이라는 것은 무엇인가라고하면
DataColumn.DataType 속성
네임스페이스는 디폴트로 설정되어 있는 System.Data이므로, 이번은 추가로 설정하는 것은 없어.

이것들을 바탕으로 만든 것



입력 인수가 ProcessName(텍스트)
출력 인수가 Processes(컬렉션)
입니다.
  • 우선, 콜렉션에 열을 2 열 (프로세스 ID, 윈도우의 이름) 작성해
  • 그 프로세스명의 프로세스를 모두 취득
  • 취득한 프로세스의 ID와 이름을 순서대로 컬렉션에 격납

  • 라고 하는 순서입니다.
    Processes = new DataTable();
    
    Processes.Columns.Add(new DataColumn("PID", typeof(int)));
    Processes.Columns.Add(new DataColumn("WindowTitle", typeof(string)));
    
    foreach (var p in System.Diagnostics.Process.GetProcessesByName(ProcessName))
    {
        try
        {
            Processes.Rows.Add(new object[] {p.Id, p.MainWindowTitle});
        }
        catch (Exception) { }
    }
    
    

    첨삭해 주셨습니다!



    타카기씨 감사합니다! 사랑!

    전반(출력용 컬렉션 준비)



    첨삭 전


    DataColumn col1 = new DataColumn();
    col1.DataType = System.Type.GetType("System.Int32");
    col1.ColumnName = "PID";
    Processes.Columns.Add(col1);
    
    DataColumn col2 = new DataColumn();
    col2.DataType = System.Type.GetType("System.String");
    col2.ColumnName = "WindowTitle";
    Processes.Columns.Add(col2);
    

    첨삭 후


    Processes.Columns.Add(new DataColumn("PID", typeof(int)));
    Processes.Columns.Add(new DataColumn("WindowTitle", typeof(string)));
    

    첨삭 내용



    열 추가가 1행씩이 되었다!

    첨삭 전 코드의 모범이 된 것은 이것입니다.
    DataTable 클래스
    // Create a new DataTable.
    System.Data.DataTable table = new DataTable("ParentTable");
    // Declare variables for DataColumn and DataRow objects.
    DataColumn column;
    DataRow row;
    
    // Create new DataColumn, set DataType, 
    // ColumnName and add to DataTable.    
    column = new DataColumn();
    column.DataType = System.Type.GetType("System.Int32");
    column.ColumnName = "id";
    column.ReadOnly = true;
    column.Unique = true;
    // Add the Column to the DataColumnCollection.
    table.Columns.Add(column);
    

    이 첨삭 후에 나오는 typeof라는 것은
    C#에서 형식을 결정하는 typeof 및 is 연산자
    typeof는 JavaScript에도 있기 때문에 알고 있다! 쓰는 방법은 다르지만!
    typeof(MDN)

    후반(프로세스를 가져와 출력용 컬렉션에 저장)



    첨삭 전


    //そのプロセス名のプロセスを全部取得し
    System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName(ProcessName);
    
    //取得したプロセスのIDと名前を順にコレクションに格納
    foreach (System.Diagnostics.Process p in ps)
    {
        DataRow row = Processes.NewRow();
        Processes.Rows.Add(p.Id,p.MainWindowTitle);
    }
    
    

    첨삭 후


    foreach (var p in System.Diagnostics.Process.GetProcessesByName(ProcessName))
    {
        try
        {
            Processes.Rows.Add(new object[] {p.Id, p.MainWindowTitle});
        }
        catch (Exception) { }
    }
    

    첨삭 내용



    행 추가하고, 추가한 행에 값을 설정해, 라고 2행으로 했던 곳이 1행이 되었습니다.
    그리고, 우선 프로세스를 취득해, 그로부터 취득한 프로세스에 대해서 foreach를 돌린다,라고 쓰고 있던 곳이
    1개로 정리되었습니다.

    그런 다음 오류 처리도 더해졌습니다.
    내가 쓰러지면 어느 곳의 객체에서 예외가 throw되어 반환되기 때문에 손을 뽑았습니다.

    끝입니다 (별로 끝이 아닙니다)



    컬렉션에 미리 열을 만들어 두면 코드 스테이지에서 열을 추가하지 않을까 생각해 봤는데, 거기는 아직 잘 안돼…
    방법을 알려주세요.

    좋은 웹페이지 즐겨찾기