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