【问题标题】:Create new PowerShell process with pipes使用管道创建新的 PowerShell 进程
【发布时间】:2019-08-22 22:01:25
【问题描述】:

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

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

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

我应该在“startInfo.Arguments”中输入什么,这样我的“Get-DiskImage”输出才能正确传送到下一个 cmdlet?

【问题讨论】:

标签: c# powershell


【解决方案1】:

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

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

【讨论】:

  • 虽然我的图像已安装 - 由于某种原因 C#(甚至是普通的 C system() 调用)都省略了数字。所以,C# 是无罪的。
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 2023-03-17
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多