3

I am trying to invoke powershell script with parameters from c#. Is there any option to give just powershell script file along with parameters rather than giving whole powershell command as a string in c# code.

2
  • Perhaps this article and/or this previous SO question could help you? (PS. because you specified C# in your question I've removed the VB.NET tag) Commented Apr 1, 2013 at 22:09
  • I trying to get some common method for .net framework, not specific for c# Commented Apr 3, 2013 at 17:31

2 Answers 2

8

A quick google search really gives you all you need. This one is from http://www.devx.com/tips/Tip/42716

You'll need the Reference System.Management.Automation then use

using System.Management.Automation;
using System.Management.Automation.Runspaces;

Create a runspace to host the PowerScript environment:

Runspace runSpace = RunspaceFactory.CreateRunspace();
runSpace.Open();

Using the runspace, create a new pipeline for your cmdlets:

Pipeline pipeline = runSpace.CreatePipeline();

Create Command objects to represent the cmdlet(s) you want to execute and add them to the pipeline. This example retrieves all the processes and then sorts them by their memory usage.

Command getProcess = new Command("Get-Process");
Command sort = new Command("Sort-Object");
sort.Parameters.Add("Property", "VM"); 
pipeline.Commands.Add(getProcess);
pipeline.Commands.Add(sort);

The preceding code functions identically to the following PowerShell command line:

PS > Get-Process | Sort-Object -Property VM

Finally, execute the commands in the pipeline and do something with the output:

Collection output = pipeline.Invoke();
foreach (PSObject psObject in output)
{
  Process process = (Process)psObject.BaseObject;
  Console.WriteLine("Process name: " + process.ProcessName);
}
Sign up to request clarification or add additional context in comments.

Comments

1

I made it some thing like this last

public static string RunScript(string scriptText)
    {
        Runspace runspace = RunspaceFactory.CreateRunspace();
        runspace.Open();
        Pipeline pipeline = runspace.CreatePipeline();
        pipeline.Commands.AddScript(scriptText);
        pipeline.Commands.Add("Out-String");
        try
        {
            Collection<PSObject> results = pipeline.Invoke();
            runspace.Close();
            StringBuilder stringBuilder = new StringBuilder();
            if (pipeline.Error.Count > 0)
            {
                //iterate over Error PipeLine until end
                while (!pipeline.Error.EndOfPipeline)
                {
                    //read one PSObject off the pipeline
                    var value = pipeline.Error.Read() as PSObject;
                    if (value != null)
                    {
                        //get the ErrorRecord
                        var r = value.BaseObject as ErrorRecord;
                        if (r != null)
                        {
                            //build whatever kind of message your want
                            stringBuilder.AppendLine(r.InvocationInfo.MyCommand.Name + " : " + r.Exception.Message);
                            stringBuilder.AppendLine(r.InvocationInfo.PositionMessage);
                            stringBuilder.AppendLine(string.Format("+ CategoryInfo: {0}", r.CategoryInfo));
                            stringBuilder.AppendLine(
                            string.Format("+ FullyQualifiedErrorId: {0}", r.FullyQualifiedErrorId));
                        }
                    }
                }
            }
            else
                stringBuilder.AppendLine(string.Format("Build is Success"));
            return stringBuilder.ToString();
        }
        catch (Exception ex)
        {
            string err = ex.ToString();
            err = "Build Failed!!!" + "\r\n" + "Check the Setup File Available or Path error";
            return err;
        }
    }


 SCRIPT = "buildmsi.ps1 " + ssource + " " + sdestination;
            projectbuildstatus.Text = RunScript(SCRIPT);

Thanks Ale Tiro for idea

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.