使用管道创建新的Powershell流程

时间:2019-04-01 17:01:08

标签: c# powershell

从CMD运行此命令会产生正确的结果:

powershell -command "& get-diskimage -imagepath C:\\file.vhdx | Get-Disk"
<here some stuff regarding VHD>

我想在C#中实现完全相同的效果(无法直接运行它,无法使用与Powershell相关的.NET东西,或其他方式)

我的代码如下:

static void LaunchCommandLineApp()
    {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.CreateNoWindow = false;
        startInfo.UseShellExecute = false;
        startInfo.FileName = "powershell";
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.RedirectStandardOutput = true;
        startInfo.Arguments = "-command \" & get-diskimage -imagepath C:\\file.vhdx | Get-Disk \"";

        using (Process exeProcess = Process.Start(startInfo)) {
            exeProcess.WaitForExit();
            var out = exeProcess.StandardOutput.ReadToEnd();
        }
    }

输入“ out”时出现错误

Get-Disk : Cannot validate argument on parameter 'Number'. The argument is null. Provide a valid value for the argument, and then try running the command again.

但是完全相同的代码在CMD中可以工作。如果我从参数中删除“ | Get-Disk”,我将从get-diskimage cmdlet的“ out”中获得正确的输出。

此外,我还尝试过花括号,如其他答案所示-错误没有改变。

问题-我应该在“ startInfo.Arguments”中添加什么,以便将“ get-diskimage”的输出正确地传递到下一个cmdlet?

1 个答案:

答案 0 :(得分:1)

这实际上不是从命令行运行和从C#运行之间的区别的问题。我创建了一个测试VHDX,无论是从C#还是从命令行运行,都得到相同的(错误)结果,如OP中所示。在这两种情况下,省略| Get-Disk部分都会显示有关磁盘映像的信息,该信息缺少磁盘号,而这正是Get-Disk所抱怨的。我怀疑需要安装该映像才能使其具有磁盘号。