在c#中调用Powershell脚本调用另一个Powershell脚本会引发UnauthorizedAccessException

问题描述

以下功能在我的测试中效果很好

    private static void RunScript(string scriptText)
    {
        Runspace runspace = RunspaceFactory.CreateRunspace();
        runspace.open();
        Pipeline pipeline = runspace.CreatePipeline();
        pipeline.Commands.AddScript(scriptText);
        pipeline.Commands.Add("Out-String");
        Collection<PSObject> results = pipeline.Invoke();
        runspace.Close();
    }

我这样称呼这个函数

RunScript(File.ReadAllText("test.ps1"));

一切都很好。现在,我修改了test.ps1以调用其他powershell脚本。

但是现在当我运行它时,我得到了一个例外。

UnauthorizedAccessException: cannot be loaded because running scripts is disabled on this system. For more @R_324_4045@ion,see 
about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.

我猜我需要将执行策略设置为“绕过”。我该如何设置?

还有没有办法将Powershell脚本文件名提供给Pipeline对象而不是脚本文件内容

解决方法

经过试验后确定,发现我可以简单地多次调用函数。一次设置策略,下一次调用任何脚本。该政策似乎仅在一次呼叫后就已设置。

RunScript("Set-ExecutionPolicy -Scope Process -ExecutionPolicy ByPass");
RunScript(File.ReadAllText("test.ps1"));

private static void RunScript(string scriptText)
{
    Runspace runspace = RunspaceFactory.CreateRunspace();
    runspace.Open();
    Pipeline pipeline = runspace.CreatePipeline();
    pipeline.Commands.AddScript(scriptText);
    pipeline.Commands.Add("Out-String");
    Collection<PSObject> results = pipeline.Invoke();
    runspace.Close();
}

您也可以将命令排队,即

private static void RunScript(string scriptText)
{
    Runspace runspace = RunspaceFactory.CreateRunspace();
    runspace.Open();
    Pipeline pipeline = runspace.CreatePipeline();
    pipeline.Commands.AddScript("Set-ExecutionPolicy -Scope Process -ExecutionPolicy ByPass");
    pipeline.Commands.AddScript(scriptText);
    pipeline.Commands.Add("Out-String");
    Collection<PSObject> results = pipeline.Invoke();
    runspace.Close();
}