1

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

2 回答 2

2

自己设置变量怎么样:

ps.Runspace.SessionStateProxy.SetVariable("PSScriptRoot", dir);
于 2018-03-09T16:19:39.583 回答
2

这很容易。

您需要使用 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();
        }
    }
}
于 2020-03-23T01:50:15.450 回答