Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PowerShell commandlet getting invoked but not responding

Invoke-MyFunction is a commandlet I wrote that takes an input file, changes it, and creates a new output file at a specified location. If I open a PowerShell on my desktop, import MyCommandlet.ps1, and run

Invoke-MyFunction -InputPath path\to\input -OutputPath path\to\output

everything works as expected. But when I try to import and invoke the command from a C# program with the code below, the commandlet doesn't run, doesn't log output, and doesn't produce the output file. It doesn't throw a CommandNotFoundException, so I assume the PowerShell object recognizes my commandlet. But I can't figure out why it doesn't execute it.

    //set up the PowerShell object
    InitialSessionState initial = InitialSessionState.CreateDefault();
    initial.ImportPSModule(new string[] { @"C:\path\to\MyCommandlet.ps1" });
    Runspace runspace = RunspaceFactory.CreateRunspace(initial);
    runspace.Open();
    PowerShell ps = PowerShell.Create();
    ps.Runspace = runspace;

    //have MyFunction take input and create output
    ps.AddCommand("Invoke-MyFunction");
    ps.AddParameter("OutputPath", @"C:\path\to\output");
    ps.AddParameter("InputPath", @"C:\path\to\input");
    Collection<PSObject> output = ps.Invoke();

Further, after invoking MyFunction, the PowerShell object ps fails to execute any other commands. Even known ones.

like image 798
dmeyerson Avatar asked Feb 07 '26 14:02

dmeyerson


1 Answers

This works for me:

//set up the PowerShell object
var initial = InitialSessionState.CreateDefault();
initial.ImportPSModule(new string[] { @"C:\Users\Keith\MyModule.ps1" });
Runspace runspace = RunspaceFactory.CreateRunspace(initial);
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;

//have MyFunction take input and create output
ps.AddCommand("Invoke-MyFunction");
ps.AddParameter("OutputPath", @"C:\path\to\output");
ps.AddParameter("InputPath", @"C:\path\to\input");
var output = ps.Invoke();
foreach (var item in output)
{
    Console.WriteLine(item);
}

With a MyModule.ps1 of:

function Invoke-MyFunction($InputPath, $OutputPath) {
   "InputPath is '$InputPath', OutputPath is '$OutputPath'"
}

One thing that did cause me a failure is that on Visual Studio 2013 (maybe 2012 as well) AnyCPU apps will actually run 32-bit on a 64-bit OS. You have to have set the execution policy for PowerShell x86 to allow script execution. Try opening up a PowerShell x86 shell in admin mode and run Get-ExecutionPolicy. If it is set to Restricted, use Set-ExecutionPolicy RemoteSigned to allows scripts to execute.

like image 132
Keith Hill Avatar answered Feb 09 '26 09:02

Keith Hill



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!