3

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

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

3 回答 3

2

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

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');
于 2013-08-29T14:04:08.957 回答
0

尽管 Keith 和 Eris 的回答很有帮助,但我认为其他人阅读这篇文章会更有帮助,用我目前的结论来组成我自己的答案。

我最初问题的答案似乎是不可能的(至少到目前为止我们还没有找到解决方法)。

因此,AddCommand(使用 AddArgument、AddParameter(s))的用例似乎是用一个或多个命令组合一个管道,然后将结果作为 Invoke 方法的输出。最终,您可以添加额外的管道(由 AddStatement 分隔),只要它们不相互依赖即可。您将在 Invoke 方法的输出集合中获得多个结果。

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

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

于 2013-09-02T07:43:26.220 回答
0

我会尝试使用不同的调用。如果您使用PowerShell.Invoke 方法(PSDataCollection、PSDataCollection、PSInvocationSettings),则可以将所需信息从管道末尾删除,并使用PSDataCollection<T> Output脚本其余部分中的值。

于 2013-08-29T16:36:37.590 回答