我正在从.NET应用程序运行PowerShell脚本,但它失败了,因为未设置$PSScriptRoot
。我该怎么设置它?
代码:
var ps = PowerShell.Create();
ps.Runspace.SessionStateProxy.Path.SetLocation(dir);
var withScript = ps.AddScript(File.ReadAllText(Path));
var results = ps.Invoke();
我还尝试使用以下方式设置它:
ps.Runspace.SessionStateProxy.SetVariable("PSScriptRoot", dir, "Script root");
但脚本中仍然为空。
这也没有用:
ps.Runspace.SessionStateProxy.SetVariable("PSScriptRoot", dir, "Script root", ScopedItemOptions.AllScope);
我尝试使用其他名称来查看它是以某种方式保留还是被覆盖,但它也是空的。
以下错误导致PSScriptRoot无法替换,因为它已经过优化:
var test = new PSVariable("PSScriptRoot", dir, ScopedItemOptions.AllScope);
runspace.SessionStateProxy.PSVariable.Set(test);
答案 0 :(得分:2)
如何自己设置变量:
ps.Runspace.SessionStateProxy.SetVariable("PSScriptRoot", dir);
答案 1 :(得分:1)
那很容易。
您需要使用PowerShell.Runspace.SessionStateProxy.InvokeCommand.GetCommand() 为您的外部脚本获取InvocationInfo对象。
然后使用PowerShell.AddCommand()将InvocationInfo添加到您的shell中,如有必要,添加参数或参数,最后调用Invoke()来执行脚本。
using System;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
public class Program
{
public static void Main(string[] args)
{
using (var runspace = RunspaceFactory.CreateRunspace())
{
// open runspace
runspace.Open();
using (var powershell = PowerShell.Create())
{
// use runspace
powershell.Runspace = runspace;
// set execution policy
powershell.AddCommand("Set-ExecutionPolicy")
.AddParameter("-ExecutionPolicy", "Bypass")
.AddParameter("-Scope", "Process")
.Invoke();
// add external script
var scriptInvocation = powershell.Runspace.SessionStateProxy.InvokeCommand
.GetCommand("MyScript.ps1", CommandTypes.ExternalScript);
powershell.AddCommand(scriptInvocation);
// add parameters / arguments
// invoke command
powershell.Invoke();
}
// close runspace
runspace.Close();
}
}
}