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

C# 从System.Management.Automation调用脚本时未设置$PSScriptRoot,c#,.net,powershell,system.management,C#,.net,Powershell,System.management,我正在从.NET应用程序运行PowerShell脚本,但它失败了,因为未设置$PSScriptRoot。我如何设置它 代码: 我还尝试使用以下方法进行设置: ps.Runspace.SessionStateProxy.SetVariable("PSScriptRoot", dir, "Script root"); 但它在脚本中仍然是空的 这也不起作用: ps.Runspace.SessionStateProxy.SetVariable("PSScriptRoot", dir, "Script

我正在从.NET应用程序运行PowerShell脚本,但它失败了,因为未设置
$PSScriptRoot
。我如何设置它

代码:

我还尝试使用以下方法进行设置:

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);

您自己设置变量怎么样:

ps.Runspace.SessionStateProxy.SetVariable("PSScriptRoot", dir);

您自己设置变量怎么样:

ps.Runspace.SessionStateProxy.SetVariable("PSScriptRoot", dir);
那很容易

您需要使用PowerShell.Runspace.SessionStateProxy.InvokeCommand.GetCommand() 获取外部脚本的InvocationInfo对象

然后使用PowerShell.AddCommand()将调用信息添加到shell中,必要时添加参数或参数,最后调用Invoke()执行脚本

使用系统;
使用系统、管理、自动化;
使用System.Management.Automation.Runspaces;
公共课程
{
公共静态void Main(字符串[]args)
{
使用(var runspace=RunspaceFactory.CreateRunspace())
{
//开放式运行空间
Open();
使用(var powershell=powershell.Create())
{
//使用运行空间
powershell.Runspace=运行空间;
//设置执行策略
powershell.AddCommand(“设置执行策略”)
.AddParameter(“-ExecutionPolicy”,“Bypass”)
.AddParameter(“-Scope”,“Process”)
.Invoke();
//添加外部脚本
var scriptInvocation=powershell.Runspace.SessionStateProxy.InvokeCommand
.GetCommand(“MyScript.ps1”,CommandTypes.ExternalScript);
powershell.AddCommand(脚本调用);
//添加参数/参数
//调用命令
powershell.Invoke();
}
//封闭运行空间
runspace.Close();
}
}
}
这很容易

您需要使用PowerShell.Runspace.SessionStateProxy.InvokeCommand.GetCommand() 获取外部脚本的InvocationInfo对象

然后使用PowerShell.AddCommand()将调用信息添加到shell中,必要时添加参数或参数,最后调用Invoke()执行脚本

使用系统;
使用系统、管理、自动化;
使用System.Management.Automation.Runspaces;
公共课程
{
公共静态void Main(字符串[]args)
{
使用(var runspace=RunspaceFactory.CreateRunspace())
{
//开放式运行空间
Open();
使用(var powershell=powershell.Create())
{
//使用运行空间
powershell.Runspace=运行空间;
//设置执行策略
powershell.AddCommand(“设置执行策略”)
.AddParameter(“-ExecutionPolicy”,“Bypass”)
.AddParameter(“-Scope”,“Process”)
.Invoke();
//添加外部脚本
var scriptInvocation=powershell.Runspace.SessionStateProxy.InvokeCommand
.GetCommand(“MyScript.ps1”,CommandTypes.ExternalScript);
powershell.AddCommand(脚本调用);
//添加参数/参数
//调用命令
powershell.Invoke();
}
//封闭运行空间
runspace.Close();
}
}
}

@Swoogan请用您已经尝试过的方法更新您的问题。给出错误信息和结果也很有帮助。@Swoogan请用您已经尝试过的内容更新您的问题。给出错误信息和结果也很有帮助。我几年前就遇到过这个问题。由于时间限制,我放弃了解决问题的尝试,最终在脚本中对路径进行了硬编码。我讨厌这个解决方案,但它让事情运转起来。文本没有路径。文件具有路径
AddScript(File.ReadAllText(Path))
->
AddCommand(Path)
。几年前我就遇到了这个问题。由于时间限制,我放弃了解决问题的尝试,最终在脚本中对路径进行了硬编码。我讨厌这个解决方案,但它让事情运转起来。文本没有路径。文件具有路径
AddScript(File.ReadAllText(Path))
->
AddCommand(Path)