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

本文关键字:powershell 变量 方法 AddParameter 中的 | 更新日期: 2023-09-27 18:29:25

请参阅下面的代码。该脚本创建变量$backupFile。我如何在下一条语句中使用该变量作为NewItemcommission的路径参数的值?

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

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

在调用第一个脚本之前,变量将不可用。试试这个:

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)的用例似乎是用一个或多个命令只组成一个管道,然后将结果作为Invoke方法的输出。最终,您可以添加额外的管道(由AddStatement分隔),只要它们不相互依赖即可。您将在Invoke方法的输出集合中获得多个结果。

当您想执行两个管道,而第二个管道取决于第一个管道的结果(并且不可能通过管道传输结果(如我的代码示例中所示)时,我认为有两个选项:1)为第一个管道调用Invoke,并在编写第二个管道时使用输出。或者2)编写一个脚本(例如使用StringBuilder),并使用一个Invoke执行该脚本。

当您使用远程连接时,后一种选择可能更可取,因为这只是对远程服务器的一次调用。