繁体   English   中英

如何获取C# PowerShell调用使用自定义函数

[英]How to get C# PowerShell call to use custom functions

我在 C# 中有一个简单的 function 来调用 PowerShell 命令并返回 output,它工作正常。 但是我希望能够返回我添加到 PowerShell 的自定义函数的值。这是我的 C# 代码:

Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
ps.Commands.AddScript("MyCustomCommand");
ICollection<PSObject> results = ps.Invoke();

当我在本地运行 PowerShell 时,我在位置C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1中设置了配置文件,所以当我打开 PowerShell 并输入MyCustomCommand时,它会返回一个字符串:

Function MyCustomCommand {
[CmdletBinding()]
param()
    return "someoutput"
}

但是,当我从 C# 进行相同的 MyCustomCommand 调用时,找不到它。 我如何永久添加此配置文件,使 C# 在以与我在桌面上打开 PowerShell 的实例时相同的方式调用命令时也将返回相同的 output?

更新我使用了@start-automating 推荐的模块解决方案,但由于执行策略我无法运行,所以我修改了它:

ps.Runspace = runspace;
ps.AddCommand("Set-ExecutionPolicy").AddArgument("Unrestricted");
ps.AddCommand("Import-Module").AddArgument("MyNewModuleName");
ps.Commands.AddScript("MyCustomCommand");

出了什么问题?

它无法在 C# 中运行您的命令,因为您的命令尚未加载。

好的,那么你如何加载它?

您已经在使用[Runspace] 这很好。 [Runspace]是您需要将 function 加载到其中的内容。 有两种方法可以做到这一点:

  1. 使用[InitialSessionState]

这是推荐的路线。 [InitialSessionState]用于填充 PowerShell [Runspace]的初始 state。 在这里您可以加载模块、声明命令、添加变量等。处理事情的最简单方法是首先将它们放在模块中。


InitialSessionState iss = InitialSessionState.CreateDefault2();
// Note: .CreateDefault2 is the recommended default of a session state
// Note: .CreateDefault reflects the default session state in v2-v4 timeframes
iss.ImportPSModule(new[] { "NameOfModule" });
iss.ImportPSModulesFromPath("PathToModule");
Runspace runspace = RunspaceFactory.CreateRunspace(iss);

您还可以使用 SessionStateFunctionEntry 手动声明各个函数

InitialSessionState iss = InitialSessionState.CreateDefault2();
iss.Commands.Add(new SessionStateFunctionEntry("MyFunction","MyDefinition"));

使用任何一种技术,这应该使用您需要的命令填充您的运行空间。

  1. .AddCommand/.AddScript 将 useLocalScope 设置为 $false

解决此问题的另一种方法是运行将更改[Runspace]的命令。 默认情况下,当您对[PowerShell] object 使用 .AddCommand 或 .AddScript 时,它将使用“本地”scope。这意味着您所做的任何更改(添加的命令、导入的模块、设置的变量等)都将是“ locally scoped”,下次在[Runspace]中运行时将不可用。

要按照您希望的方式进行这项工作,请将 .AddScript /.AddCommand 与 useLocalScope(第二个参数)一起设置为 false。

这是一个快速的 PowerShell 概念证明:

[PowerShell]::Create().AddScript('$x = 1',$false).AddStatement().AddScript('$x').Invoke()

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM