C# 从System.Management.Automation调用脚本时未设置$PSScriptRoot
我正在从.NET应用程序运行PowerShell脚本,但它失败了,因为未设置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
$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)
。