How to pass a parameter from C# to a PowerShell script file?
powershell
Solution
How's this?
static void Main()
{
string script = @"C:\test.ps1 -arg 'hello world!'";
StringBuilder sb = new StringBuilder();
PowerShell psExec = PowerShell.Create();
psExec.AddScript(script);
psExec.AddCommand("out-string");
Collection<PSObject> results;
Collection<ErrorRecord> errors;
results = psExec.Invoke();
errors = psExec.Streams.Error.ReadAll();
if (errors.Count > 0)
{
foreach (ErrorRecord error in errors)
{
sb.AppendLine(error.ToString());
}
}
else
{
foreach (PSObject result in results)
{
sb.AppendLine(result.ToString());
}
}
Console.WriteLine(sb.ToString());
}
Here's a similar version that passes an instance of a DateTime
static void Main()
{
StringBuilder sb = new StringBuilder();
PowerShell psExec = PowerShell.Create();
psExec.AddCommand(@"C:\Users\d92495j\Desktop\test.ps1");
psExec.AddArgument(DateTime.Now);
Collection<PSObject> results;
Collection<ErrorRecord> errors;
results = psExec.Invoke();
errors = psExec.Streams.Error.ReadAll();
if (errors.Count > 0)
{
foreach (ErrorRecord error in errors)
{
sb.AppendLine(error.ToString());
}
}
else
{
foreach (PSObject result in results)
{
sb.AppendLine(result.ToString());
}
}
Console.WriteLine(sb.ToString());
}
Problem
From the command line I can do. ``` .\test.ps1 1 ``` How do I pass the parameter when doing this from C#? I've tried ``` .AddArgument(1) .AddParameter("p", 1) ``` And I have tried passing values in as IEnumerable<object> in the .Invoke() but $p does not get the value. ``` namespace ConsoleApplication1 { using System; using System.Linq; using System.Management.Automation; class Program { static void Main() { // Contents of ps1 file // param($p) // "Hello World ${p}" var script = @".\test.ps1"; PowerShell .Create() .AddScript(script) .Invoke().ToList() .ForEach(Console.WriteLine); } } } ```