【问题标题】:Function not found when contained in script file and invoked from C#包含在脚本文件中并从 C# 调用时找不到函数
【发布时间】:2017-09-30 06:48:16
【问题描述】:

我正在尝试从 C# 调用脚本文件中包含的 powershell 函数。 当它是一个字符串变量时,我能够成功调用该函数,但是当我尝试从脚本文件中调用它时,我得到了这个错误:

“Test-Me”一词未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。

从 C# 调用脚本文件函数还需要什么?

public string RunScriptFunction(string userName)
{
    //var script = "function Test-Me($param1, $param2) { \"Hello from Test-Me with $param1, $param2\" }";
    var script = ". C:\\TestMe.ps1";
    using (var powershell = PowerShell.Create())
    {
        powershell.AddScript(script);
        var results1 = powershell.Invoke();
        powershell.Commands.Clear();

        powershell.AddCommand("Test-Me").AddParameter("param1", userName).AddParameter("param2", "HELLO");

        var results = powershell.Invoke();
        var stringBuilder = new StringBuilder();
        foreach (PSObject obj in results)
        {
            stringBuilder.AppendLine(obj.ToString());
        }
        return stringBuilder.ToString();
    }
}

【问题讨论】:

  • 尝试删除 .来自var script = ". C:\\TestMe.ps1"
  • '.'需要,这称为“点源”,是导入 PowerShell 函数的旧方法(顺便说一句,新方法是使用模块)
  • 我已经尝试过了,但没有帮助。我也尝试使用 global:funcName 无济于事。

标签: c# powershell


【解决方案1】:

我可以重现您的问题,即由于执行策略,您无法对 PowerShell 脚本进行点源。检查属性powershell.Streams.Error 中的错误。它的值可能是:

无法加载文件 C:\TestMe.ps1,因为此系统上禁用了运行脚本。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=135170 上的 about_Execution_Policies。

在这种情况下,一种可能的解决方案是在对脚本进行点源之前为您的流程范围设置 ExecutionPolicy:

var script = "Set-ExecutionPolicy Bypass -Scope Process; . C:\\TestMe.ps1";

【讨论】:

    猜你喜欢
    • 2017-12-02
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2018-10-15
    • 2014-08-04
    相关资源
    最近更新 更多