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); } } } ```

Original source