[英]How to use powershell variable in PowerShell.AddParameter method in C#?
请参阅下面的代码。 该脚本创建变量$ backupFile。 如何在下一个语句中将该变量用作New-Item表达式的path参数的值?
using (var ps = PowerShell.Create())
{
ps.RunspacePool = _runspacePool;
ps.AddScript("$backupFile = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(),'{0}.bak')".FormatInvariant(databaseName));
ps.AddStatement();
ps.AddCommand("New-Item")
.AddParameter("Force")
.AddParameter("ItemType", "File")
.AddParameter("Path", /* How to use $backupFile?? */));
ps.Invoke();
}
在调用第一个脚本之前,该变量将不可用。 尝试这个:
ps.AddScript("$backupFile = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(),'{0}.bak')".FormatInvariant(databaseName));
ps.Invoke();
ps.Commands.Clear();
var backupFile = ps.Runspace.SessionStateProxy.PSVariable.Get("backupFile");
ps.AddCommand("New-Item")
.AddParameter("Force")
.AddParameter("ItemType", "File")
.AddParameter("Path", backupFile ));
ps.Invoke();
如果你走这条路线,我认为你不能使用RunspacePool,因为你可能会在每个Invoke()
之间获得不同的运行空间。 在这种情况下,该变量将不可用于其他运行空间。 在这种情况下,您真的需要使用RunspacePool吗? 如果你这样做,为什么不在C#中做第一位:
var backupFile = Path.Combine(Path.GetTempPath(), databaseName +'.bak');
我会尝试使用不同的Invoke。 如果使用PowerShell.Invoke方法(PSDataCollection,PSDataCollection,PSInvocationSettings),则可以从管道末尾删除所需信息,并在脚本的其余部分使用PSDataCollection<T> Output
中的值。
虽然Keith和Eris的答案很有帮助,但我认为对于其他读这篇文章的人来说,更有帮助的是,到目前为止我的结论是用自己的答案来构建自己的答案。
我最初的问题的答案似乎是不可能的(至少到目前为止我们找不到办法)。
因此,似乎AddCommand(使用AddArgument,AddParameter(s))的用例是使用一个或多个命令组成一个管道,然后将结果作为Invoke方法的输出。 最终,您可以添加其他管道(由AddStatement分隔),只要它们不相互依赖。 您将在Invoke方法的输出集合中获得多个结果。
当你想要执行2个管道而第二个取决于第一个管道的结果时(并且不可能管道结果(如我的代码示例中所示),我认为有两个选项:1)第一个管道的Call Invoke并在编写第二个管道时使用输出。 或者2)编写一个脚本(例如使用StringBuilder)并使用一个Invoke执行该脚本。
当您使用远程连接时,后一个选项可能更可取,因为这只是对远程服务器的一次调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.