Отслеживание прогресса DISM с помощью C # - Работает в Windows 10, но не в WinPE - PullRequest
0 голосов
/ 05 мая 2019

Я использую C # для запуска процесса DISM для захвата / применения изображения и для отслеживания прогресса.

Когда я запускаю код в Windows 10, прогресс обновляется нормально, но когда код запускаю кодв среде WinPE прогресс не обновляется, но процесс все еще работает нормально.

Этот код запускает метод для запуска DISM.Просто обратите внимание, что он работает на .NET Framework 4.0

Task T = Task.Factory.StartNew(() =>
                            {
                                ApplyImage(machineName, imageIndex, imageDescription);
                                //Utilities.BailOut();
                            });

Это код, который я использую для запуска DISM, Аргументы меняются в зависимости от потребностей.

     public void ApplyImage(string imageName, int imageIndex)
            {
                string _imageName = imageName;
                int _index = imageIndex;
                System.Diagnostics.Process process = new System.Diagnostics.Process();
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo
                {
                    UseShellExecute = true,
                    CreateNoWindow = true,
                    RedirectStandardOutput = true,
                    FileName = "Dism.exe",
                    Arguments = $@"/apply-image /imagefile:{OS_Deploy}\{_imageName} /index:{_index} /applydir:{TargetDisk}"
                };
                startInfo.UseShellExecute = false;
                process.StartInfo = startInfo;
                process.OutputDataReceived += (sender, e) => setLabelText(lblProgress, e.Data);
                process.Start();
                process.BeginOutputReadLine();

                process.WaitForExit();
                process.CancelOutputRead();
                process.Close();
            }

И этоэто код, который устанавливает текст метки

private void setLabelText(Label label, string text)
        {
            if (label.InvokeRequired)
            {
                label.Invoke((System.Action)(() => setLabelText(label, text)));
            }
            else
            {
                try
                {
                    if (text.Contains("%"))
                    {
                        label.Text = "Status : " + text.Split('%')[0].Substring(text.Split('%')[0].Length - 4, 4) + "%";
                    }
                    else if (text == "The operation completed successfully.")
                    {
                        label.Text = "Completed!";
                    }
                    else
                    {
                        label.Text = text;
                    }
                }
                catch (Exception) { }
            }
        }

Что может быть причиной этой проблемы и что я могу исправить или создать обходной путь?

...