问题描述
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();
}