Calling Powershell functions from C#

后端 未结 2 604
悲哀的现实
悲哀的现实 2020-12-09 10:54

I have a PS1 file with multiple Powershell functions in it. I need to create a static DLL that reads all the functions and their definitions in memory. It then invokes one o

相关标签:
2条回答
  • 2020-12-09 11:01

    Here's the equivalent C# code for the code mentioned above

    string script = "function Test-Me($param1, $param2) { \"Hello from Test-Me with $param1, $param2\" }";
    
    using (var powershell = PowerShell.Create())
    {
        powershell.AddScript(script, false);
    
        powershell.Invoke();
    
        powershell.Commands.Clear();
    
        powershell.AddCommand("Test-Me").AddParameter("param1", 42).AddParameter("param2", "foo");
    
        var results = powershell.Invoke();
    }
    
    0 讨论(0)
  • 2020-12-09 11:21

    It is possible and in more than one ways. Here is probably the simplest one.

    Given our functions are in the MyFunctions.ps1 script (just one for this demo):

    # MyFunctions.ps1 contains one or more functions
    
    function Test-Me($param1, $param2)
    {
        "Hello from Test-Me with $param1, $param2"
    }
    

    Then use the code below. It is in PowerShell but it is literally translatable to C# (you should do that):

    # create the engine
    $ps = [System.Management.Automation.PowerShell]::Create()
    
    # "dot-source my functions"
    $null = $ps.AddScript(". .\MyFunctions.ps1", $false)
    $ps.Invoke()
    
    # clear the commands
    $ps.Commands.Clear()
    
    # call one of that functions
    $null = $ps.AddCommand('Test-Me').AddParameter('param1', 42).AddParameter('param2', 'foo')
    $results = $ps.Invoke()
    
    # just in case, check for errors
    $ps.Streams.Error
    
    # process $results (just output in this demo)
    $results
    

    Output:

    Hello from Test-Me with 42, foo
    

    For more details of the PowerShell class see:

    http://msdn.microsoft.com/en-us/library/system.management.automation.powershell

    0 讨论(0)
提交回复
热议问题