简体   繁体   中英

Asynchronously running multiple PowerShell scripts from C#

Short description of what I`m trying to do:

I am working on a.Net WinForm application from where I am trying to run multiple PowerShell scripts on a remote server and display results on the form.

At this moment I`m executing the scripts synchronously and this is causing me problems with long running scripts.

Any idea on how I could make this function to be executed Asynchronously?

public string NewPsSession(string ServerName, string command)
    {
        Runspace runspace = RunspaceFactory.CreateRunspace();
        runspace.Open();
        PowerShell psSession = PowerShell.Create();

        psSession.Commands.AddScript("$sessions = New-PSSession -ComputerName " + ServerName + Environment.NewLine  
        + "Invoke-Command -session $sessions -ScriptBlock {" + command + "}" + Environment.NewLine                 
        + "Remove-PSSession -Session $sessions" + Environment.NewLine);

        psSession.Commands.AddCommand("Out-String");

        Collection<PSObject> results = new Collection<PSObject>();
        try
        {
            results = psSession.Invoke(); 
        }

        catch (Exception ex)
        {
            results.Add(new PSObject((object)ex.Message));
        }
        runspace.Close(); 

        StringBuilder stringBuilder = new StringBuilder();

        foreach (PSObject obj in results)
        {
            stringBuilder.AppendLine(obj.ToString());
        }

        return stringBuilder.ToString(); 
    }

Any suggestion would be much appreciated. Thanks!

Change your NewPsSesson method to async and return a Task<string> . Then move your code into a Task<string>.Run() block and await it. Then you can either await your NewPsSession() method or monitor it as a task as I have done in Main()

   class Program
    {
        public static void Main(string[] args)
        {
            Task<string> task = NewPsSession("", "");
            while (!task.IsCompleted)
            {
                Task.Delay(500).Wait();
                Console.WriteLine("Waiting...");
            }

            Console.WriteLine(task.Result);
            Console.WriteLine("Done");
        }

        public static async Task<string> NewPsSession(string ServerName, string command)
        {
            var result = await Task<string>.Run(() =>
            {
                Runspace runspace = RunspaceFactory.CreateRunspace();
                runspace.Open();
                PowerShell psSession = PowerShell.Create();

                psSession.Commands.AddScript("$sessions = New-PSSession -ComputerName " + ServerName + Environment.NewLine
                + "Invoke-Command -session $sessions -ScriptBlock {" + command + "}" + Environment.NewLine
                + "Remove-PSSession -Session $sessions" + Environment.NewLine);

                psSession.Commands.AddCommand("Out-String");

                Collection<PSObject> results = new Collection<PSObject>();
                try
                {
                    results = psSession.Invoke();
                }

                catch (Exception ex)
                {
                    results.Add(new PSObject((object)ex.Message));
                }
                runspace.Close();

                StringBuilder stringBuilder = new StringBuilder();

                foreach (PSObject obj in results)
                {
                    stringBuilder.AppendLine(obj.ToString());
                }
                return stringBuilder.ToString();
            });

            return result;

        }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM