Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中的powershell.AddParameter方法中使用powershell变量?_C#_.net_Powershell - Fatal编程技术网

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

如何在C#中的powershell.AddParameter方法中使用powershell变量?,c#,.net,powershell,C#,.net,Powershell,请参阅下面的代码。该脚本创建变量$backupFile。如何在下一条语句中使用该变量作为新项的path参数的值 using (var ps = PowerShell.Create()) { ps.RunspacePool = _runspacePool; ps.AddScript("$backupFile = [System.IO.Path]::Combine([System.IO.Path]::GetTempPat

请参阅下面的代码。该脚本创建变量$backupFile。如何在下一条语句中使用该变量作为新项的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#中的第一位呢


我会尝试使用不同的调用。如果使用,则可以从管道末端删除所需信息,并在脚本的其余部分使用来自
PSDataCollection输出的值。

虽然Keith和Eris的答案很有用,但我认为这对其他人阅读此文会更有帮助,用我目前的结论来撰写我自己的答案

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

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

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


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

AFAIK使用RunspacePool是远程连接的首选方法。这就是我使用RunspacePool的原因。这也是为什么我不能在C#中做第一位的原因,因为那将在本地计算机上。一个更基本的问题是,AddCommand的用例是什么。似乎无法将其结果赋给变量。因此,您只能在调用的输出中捕获它。所以在我看来,对于Powershell类,您应该一次执行一个管道。因此,一个包含AddCommand()、AddStatement()、AddCommand()、AddStatement等的序列。。。。这不是一条路要走(也许当它是独立的命令时除外)。在我看来,在远程处理情况下,在每个命令之后调用Invoke也不是最好的方法。那么,仅仅构建一个脚本就最好了?AddCommand用于将一个命令添加到当前“正在构建”的管道中。顺便说一句,您没有提到远程处理,我在代码中没有看到您配置远程连接的地方。:-)但是,为了回答您的问题,是的,最好将$backupFile逻辑和New Item命令放在一个脚本字符串中,然后用AddScript()添加,然后调用它。我确实没有提到远程处理,因为在我看来,它与问题无关。是的,我知道这是可能的。我只是好奇,在AddParameter方法中,我是否可以引用上一个脚本行中的变量集(只需一次调用)
var backupFile = Path.Combine(Path.GetTempPath(), databaseName +'.bak');