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.
Asked
Active
Viewed 9,508 times
3
-
Perhaps [this](http://www.codeproject.com/Articles/18229/How-to-run-PowerShell-scripts-from-C) article and/or [this](http://stackoverflow.com/questions/527513/execute-powershell-script-from-c-sharp-with-commandline-arguments) previous SO question could help you? (**PS.** because you specified C# in your question I've removed the VB.NET tag) – nkvu Apr 01 '13 at 22:09
-
I trying to get some common method for .net framework, not specific for c# – Josh Apr 03 '13 at 17:31
2 Answers
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);
}

kalbsschnitzel
- 817
- 1
- 8
- 29
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

Josh
- 1,009
- 2
- 13
- 25