0

首先,很抱歉我无法给出正确的标题。在搜索、搜索和搜索之后,我几乎整天都被一个想法困扰着,直到我决定在 Stackoverflow 上问它!

所以这就是我卡住的地方:

(我正在制作一个当前用 C# 编码的自动安装程序,它是荷兰语。它真的很棒,但我只需要一件事来完成我的基础。例如:

  • 您在复选框中选择了“多个”对象,这些对象是从复选框本身读取的,它们被修剪并在此之后启动。

现在一切正常,我想添加一个等待方法,例如我们得到:

  • Malwarebytes 和 CCleaner 作为安装“示例”。

现在,当两者都被选中时,我单击开始,它会启动这两个程序。我想做的是:告诉程序启动一个程序,做你的事情,一旦它完成(关闭)它应该去下一个。

但是...有一个问题,我的程序是在一个数组中启动的,所以如果检查了多个对象,它基本上可以工作,而不是启动所有检查的对象。而且我真的不知道如何达到同样的目的,基本上是:

  • 如果选择了多个对象,请启动对象,执行您的操作(自动单击等),一旦关闭并确认已关闭,则继续执行下一个对象并执行相同的操作,直到完成。我想让它与进度条一起工作,但从来没有真正研究过进度条,因为它们看起来很混乱。

我有一段代码可以找到进程 ID,所以也许我可以用它做点什么,但是进程 ID 在我启动的应用程序上永远不会相同,所以当它们以数组启动时,我遇到了一个问题。

有人可以帮我弄清楚什么以及如何编码/执行此操作吗?

这是我用来完成这项工作的代码:

                string pad = Application.StartupPath;

            foreach (string checkedItem in checkedListBox1.CheckedItems)
            {
                if (checkedItem.Contains("."))
                {
                    string str = checkedItem;
                    if (str.Contains("."))
                    {
                        int index = str.IndexOf('.');
                        string folder = str.Substring(0, index);
                        try
                        {
                            bool started = false;
                            var process = new Process();
                            process.StartInfo.FileName = pad + "/data/" + folder + "/" + checkedItem;
                            started = process.Start();
                            var processID = process.Id;
                            var processNAAM = process.ProcessName;
                            textBox1.Text += "Gevonden - ID: " + processID + "     NAAM: " + processNAAM + Environment.NewLine;
                            textBox1.Text += DateTime.Now.ToString("HH:mm:ss", System.Globalization.DateTimeFormatInfo.InvariantInfo) + "  -  " + "Installatie Keuze wordt opgestart." + Environment.NewLine;
                            process.WaitForExit();

                        }
                        catch (Exception)
                        {
                        }
                    }
                }
            }
4

2 回答 2

1

首先,您可以使用 CheckedListBox 的CheckedItems属性使代码更简单、更短。其次,将字符串从一个复制到另一个是没有意义的。字符串在 .NET 中是不可变的——它们永远不会改变。您可以只保留一份副本并从那里剪切。

接下来,您可以使用中的方法System.IO.Path来剪切没有扩展名的文件名,或者构建完整路径而不必担心“/”的太多或太少。

第三,对于您最初的问题 - 只需调用WaitForExit您的Process对象使其等待,然后再继续处理进程列表。

第三

foreach (string checkedItem in checkedListBox1.CheckedItems)
{
   if (checkedItem.Contains("."))
   {
       string baseName = Path.GetFileNameWithoutExtension(checkedItem);
       string processPath = Path.Combine(pad, "data", baseName, checkedItem); 
       Process process = Process.Start(processPath);
       process.WaitForExit();
   }
}
于 2013-02-18T00:04:10.937 回答
0

在您开始进程 ( process.Start()) 的行之后,只需添加以下内容:

process.WaitForExit()

这将暂停包含线程,直到目标进程退出。

于 2013-02-17T23:59:39.233 回答