从System.Management.Automation调用脚本时未设置$ PSScriptRoot

时间:2018-03-09 16:14:17

标签: c# .net powershell system.management

我正在从.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);

2 个答案:

答案 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();
        }
    }
}