Запускать файлы сценариев Powershell шаг за шагом в WPF (C #) - PullRequest
0 голосов
/ 15 октября 2019

Я новичок в C # и имею графический интерфейс в WPF, где в какой-то момент он должен автоматически начать выполнение сценариев Powershell, но желательно один за другим. Поскольку я вижу, что все методы выполняются одновременно, не дожидаясь завершения предыдущего, поэтому мой вопрос: что лучше использовать какие-то потоки или асинхронные методы?

Если я пытаюсь использовать task.WaitForExit ();затем он замораживает графический интерфейс, что не приемлемо. Я также пытался использовать таймер, но, похоже, он этого не видит. Кроме того, у меня есть несколько файлов PS1 и несколько файлов Bat, которые нужно запускать по одному. Подскажите, пожалуйста, какой метод лучше использовать и как его сочетать с активным GUI в этом случае?

public partial class Start_deployment : Window
{
    public Start_deployment()
    {
        InitializeComponent();
        Run_scripts();
        System.Windows.Application.Current.Shutdown();
    }

    public void Run_scripts()
    {
        var ps1File = @"C:\test\Install.ps1";
        var startInfo = new ProcessStartInfo()
        {
            FileName = "powershell.exe",
            Arguments = $"-ExecutionPolicy Bypass -WindowStyle Hidden -NoProfile -file \"{ps1File}\"",
            UseShellExecute = false
        };
        var task = Process.Start(startInfo);
        //task.WaitForExit();
    }

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {

    }
}

1 Ответ

1 голос
/ 15 октября 2019

Process.Start() возвращает Process экземпляр, который имеет событие Exited. Подпишитесь на это событие, чтобы получать уведомление о его завершении:

public partial class Start_deployment : Window
{
    public Start_deployment()
    {
        InitializeComponent();
        Run_scripts();
    }

    public void Run_scripts()
    {
        var ps1File = @"C:\test\Install.ps1";
        var startInfo = new ProcessStartInfo()
        {
            FileName = "powershell.exe",
            Arguments = $"-ExecutionPolicy Bypass -WindowStyle Hidden -NoProfile -file \"{ps1File}\"",
            UseShellExecute = false
        };
        var proc = Process.Start(startInfo);
        proc.Exited += OnProcessExited;
    }

    private void OnProcessExited(object sender, EventArgs eventArgs)
    {            
        // todo, e.g.
        // System.Windows.Application.Current.Shutdown();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...