我有一个包含多个PowerShell函数的PS1文件。我需要创建一个静态DLL,将所有函数及其定义读入内存。当用户调用DLL并传递函数名称以及函数参数时,它将调用其中一个函数。
我的问题是,是否可以实现这一点?即调用在内存中已经读取和存储的函数?
谢谢。
我有一个包含多个PowerShell函数的PS1文件。我需要创建一个静态DLL,将所有函数及其定义读入内存。当用户调用DLL并传递函数名称以及函数参数时,它将调用其中一个函数。
我的问题是,是否可以实现这一点?即调用在内存中已经读取和存储的函数?
谢谢。
以下是上述代码的等效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();
}
有不止一种方式可以实现,这里介绍其中最简单的方法。
假设我们的函数在名为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/zh-cn/library/system.management.automation.powershell