C# 使用管道创建新的PowerShell进程
从CMD运行此命令将产生正确的结果: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
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();
}
}