繁体   English   中英

如何在C#中的PowerShell.AddParameter方法中使用powershell变量?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM