使用管道创建新的 PowerShell 进程

从 CMD 运行它会产生正确的结果:


powershell -command "& Get-DiskImage -imagepath C:\\file.vhdx | Get-Disk"

<Here is 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:无法验证参数“Number”的参数。参数为空。为参数提供有效值,然后再次尝试运行该命令。


但完全相同的代码在 CMD 中有效。如果我从参数中删除“| Get-Disk”,我将从Get-DiskImage cmdlet 的“out”中获得正确的输出。


另外,正如其他答案所建议的那样,我尝试使用花括号 - 错误没有改变。


我应该在“startInfo.Arguments”中输入什么,以便我的“Get-DiskImage”输出将正确地传送到下一个 cmdlet?


函数式编程
浏览 93回答 1
1回答

慕桂英3389331

这实际上不是从命令行运行和从 C# 运行之间的区别的问题。我创建了一个测试 VHDX,无论是从 C# 还是命令行运行,都得到了相同的(错误)结果,如 OP 所示。在这两种情况下,省略的| Get-Disk部分显示了有关磁盘映像的信息,缺少磁盘编号,这正是Get-Disk抱怨的内容。我怀疑需要安装图像才能使其具有磁盘号。
打开App,查看更多内容
随时随地看视频慕课网APP