在SAP GUI中运行多个脚本

时间:2017-05-05 10:07:21

标签: c# vbscript process sap

上下文:我的SAP GUI中有两个打开的会话,其ID为:

  • /应用/ CON [0] / SES [0]
  • /应用/ CON [0] / SES [1]

我想在每个会话中运行1个脚本(vbs),这是我的代码:

foreach (GuiSession s in _dicSap[tmpDKey].get_lstSapSession())
{
    if (!s.Busy)
    {
        Process p = Process.Start(scriptName, s.Id); //s.Id=/app/con[0]/ses[0]
        await Task.Delay(5000);
        break;
    }
}

问题:我的脚本已正确执行,但它们是逐个执行的。 我想同时运行这些脚本。我不明白,因为我没有使用.WaitForExit()。

我的代码是错误的还是无法在C#中的SAP GUI中运行多脚本?

抱歉我的英文。 此致

1 个答案:

答案 0 :(得分:0)

可能是necro-threading,但这就是我解决类似问题的方法。 在我的情况下,我必须运行N个任务,而不是两个。另请注意,我在c#代码中有脚本步骤,而不是单独的文件。无论如何,这个解决方案应该符合您的要求。

  1. 首先,您需要创建现有(初始)会话的多个会话:

    for (int i = 0; i < numOfSessions - 1 ; i++)
        {
            SapSession.CreateSession();
        }
    
  2. 所有这些会话都将放在一个列表中(sessionList)。我使用自定义sessionDetails类,因为我需要存储ID和活动信息:

    for (int i = 0; i < _maxSessions; i++)
     {
         sessionDetail sd = new sessionDetail((GuiSession)sapConnection.Sessions.Item(i), false, i);
         sessionList.Add(sd);
     }
    
    
    class sessionDetail
    {
        public GuiSession sapSession { get; }
        public bool isUsed { get; set; }
        public int sessionId { get; set; }
    
        public sessionDetail(GuiSession SapSession, bool IsUsed, int SessionId)
        {
            sapSession = SapSession;
            isUsed = IsUsed;
            sessionId = SessionId;
        }
    
    }
    
    1. 其次,您需要并行执行程序。 假设您有一个需要执行的脚本scr数组:

          string[] scr = { "scriptingTask1", " scriptingTask2", " scriptingTask3" };
      
    2. 然后,您将为每个脚本创建并行线程:

              Parallel.ForEach<string>(scr
                       , new ParallelOptions { MaxDegreeOfParallelism = _maxSessions }
                       , (script) => DoSomeWork(script, sessionList)
                       );
      
      1. 为lambda传递的方法会将脚本任务分配给会话并启动它们

        private void DoSomeWork(string scrptTask, List<sessionDetail> _sessionList)
        {
            sessionDetail _sessionToUse;
            foreach (sessionDetail s in _sessionList)
            {
                if (!s.isUsed)
                {
                    _sessionToUse = s;
                    s.isUsed = true;
        
                    //// Do your stuff here
        
                    s.isUsed = false;
                    break;
                }
            }
        }
        
      2. 第四,确保脚本中的地址(如“/ app / con [0] / ses [0] / wnd [0] / usr / ctxtP_EKORG”)在其中使用相应的会话ID。您可以在这条路径的中间看到它(ses [0])。 如果你在所有脚本中继续引用ses [0],你可能会得到“ID未找到元素”错误。

      3. 君士坦丁。