Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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进程_C#_Powershell - Fatal编程技术网

C# 使用管道创建新的PowerShell进程

C# 使用管道创建新的PowerShell进程,c#,powershell,C#,Powershell,从CMD运行此命令将产生正确的结果: powershell -command "& Get-DiskImage -imagepath C:\\file.vhdx | Get-Disk" <Here is some stuff regarding VHD> 在“out”中,我得到一个错误: 获取磁盘:无法验证参数“Number”上的参数。参数为空。请为参数提供有效值,然后重试运行该命令 但在CMD中使用的代码完全相同。如果我从参数中删除“| Get Disk”,我将在cmdl

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

powershell -command "& Get-DiskImage -imagepath C:\\file.vhdx | Get-Disk"
<Here is some stuff regarding VHD>
在“out”中,我得到一个错误:

获取磁盘:无法验证参数“Number”上的参数。参数为空。请为参数提供有效值,然后重试运行该命令

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

此外,正如其他答案所示,我也尝试过使用花括号——错误并没有改变


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

这实际上不是从命令行和从C#运行之间的差异问题。我创建了一个测试VHDX,无论是从C#还是从命令行运行,都得到了相同的(错误)结果,如OP所示


在这两种情况下,省略
|Get Disk
部分会显示有关磁盘映像的信息,该映像缺少磁盘号,这正是
Get Disk
所抱怨的。我怀疑需要安装映像才能获得磁盘号。

get-diskimage的输出是什么?输入正在查找错误的类型。@ClaytonHarbich只是一个包含信息的文本,如果我们省略“| Get Disk”,这可能是一个很好的观点。该命令是否在PowerShell终端中工作?当我的映像已装入时,由于某种原因,C#(甚至是普通的C system()调用)都省略了数字。所以,C#无罪。
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();
    }
}