从 C# 调用 Powershell 函数
Posted
技术标签:
【中文标题】从 C# 调用 Powershell 函数【英文标题】:Calling Powershell functions from C# 【发布时间】:2011-05-09 22:11:38 【问题描述】:我有一个 PS1 文件,其中包含多个 Powershell 函数。我需要创建一个静态 DLL 来读取内存中的所有函数及其定义。然后,当用户调用 DLL 并传入函数名称以及函数的参数时,它会调用这些函数之一。
我的问题是,是否有可能做到这一点。即调用已读取并存储在内存中的函数?
谢谢
【问题讨论】:
如果您想在 .NET Core 中执行 powershell,请查看https://***.com/questions/39141914/running-powershell-from-net-core 【参考方案1】:这是上面提到的代码的等效 C# 代码
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();
【讨论】:
我尝试实现此功能,但遇到了麻烦。我正在使用 WinUI 3。我在这里发布了一个单独的问题,详细说明:***.com/questions/70843636/…【参考方案2】:这是可能的,而且方式不止一种。这可能是最简单的一个。
鉴于我们的函数在 MyFunctions.ps1
脚本中(本演示中只有一个):
# MyFunctions.ps1 contains one or more functions
function Test-Me($param1, $param2)
"Hello from Test-Me with $param1, $param2"
然后使用下面的代码。它在 PowerShell 中,但实际上可以翻译成 C#(你应该这样做):
# 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
输出:
Hello from Test-Me with 42, foo
有关PowerShell
类的更多详细信息,请参阅:
http://msdn.microsoft.com/en-us/library/system.management.automation.powershell
【讨论】:
问题是如何在c#中做到这一点,你回答如何在powershell中做到这一点并告诉他自己翻译成c#?我知道这并不难,但真的吗? @Eric Brown - Cal - 这是您对问题的理解。我的理解不同——应该从 C#、VB.NET、F#、任何 .NET 语言调用哪些 PowerShell API 方法。 我糊涂了吗?标题不是“从 C# 调用 Powershell 函数”。我错过了什么吗? 这是标题中的问题吗?问题是:“我的问题是,是否有可能做到这一点。即调用一个已读取并存储在内存中的函数?”。以上是关于从 C# 调用 Powershell 函数的主要内容,如果未能解决你的问题,请参考以下文章
c# - 如何在运行时从模块代码中获取 PowerShell 模块版本
如何从 C# 文件调试“调用”Powershell (ps1)