【问题标题】:Process.StandardOutput.ReadToEnd() and extraneous newline charsProcess.StandardOutput.ReadToEnd() 和无关的换行符
【发布时间】:2012-07-02 14:42:27
【问题描述】:

我试图理解为什么当我调用上述函数时,我正在读取的输出中每 80 列得到十六进制 0D0A。

为了简洁起见,我有一个用于测试的 powershell 脚本,其中包含两行:

$xmlSpew = "<IISAppPoolConfig><DefaultWebSite><ApplicationPoolName>DefaultAppPool</ApplicationPoolName></DefaultWebSite><AuthN>Basic</AuthN></IISAppPoolConfig>"
Write-Output $xmlSpew

我正在使用带有 ProcessStartInfo 的 Process 对象调用脚本,如下所示:

var psi = new ProcessStartInfo
{
    WorkingDirectory = Path.GetDirectoryName(FileToRun),
    FileName = FileToRun,
    Arguments = Arguments,
    UseShellExecute = false,
    CreateNoWindow = true,
    RedirectStandardError = true,
    RedirectStandardOutput = true,
};

var process = new Process
{
    StartInfo = psi,
    EnableRaisingEvents = true,
};

FileToRun 值为:

C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe

参数值为:

-File "C:\Program Files\MyTest\MyProgInputs\read.d\IISAppPoolConfig.ps1"

脚本运行良好,我返回退出代码 0,但我使用标准输出每 80 个字符有一个神秘的(对我而言)0D0A 换行符:

var Stdout = new List<string>;

...

Stdout.Add(process.StandardOutput.ReadToEnd());

一旦我将标准输出存储在字符串 var 中,这将对我的 XML 工作造成严重破坏。我希望得到我在 ps1 脚本中写入标准输出的确切内容,而不是额外的换行符。

我错过了什么?我已经寻找其他有这个问题的人,但我没有找到答案。希望不是我受到搜索挑战。

【问题讨论】:

  • 我还要提一下,这是一个 64 位控制台 .exe 项目。
  • 重定向输出时出现很多问题。默认控制台为 80 个字符宽。尝试 -NonInteractive 命令行选项。也许 -OutputFormat XML。
  • -NonInteractive 没有效果。 -NonInteractive 加上 -OutputFormat XML 生成编码的 XML 没有换行符,所以这可能是要走的路。使用 -OutputFormat XML 后的 XML:#schemas.microsoft.com/powershell/2004/04"><SS="Output"><IISAppPoolConfig><DefaultWebSite><ApplicationPoolName>DefaultAppPool</ApplicationPoolName>< /DefaultWebSite><AuthN>基本</AuthN></IISAppPoolConfig>
  • 但是在“#对着 powershell 握拳... ;)
  • 你不能只修改脚本以将 xml 写入文件而不是控制台吗?

标签: c# windows .net-4.0 process


【解决方案1】:

按照this P/Invoke 方法,将dwXCountChars 设置为一个非常大的值。不要忘记在标志中也包含STARTF_USECOUNTCHARS

【讨论】:

  • 当我按照以下 P/Invoke 解决方案中的描述调用 CreateProcess 时(使用 8 作为 STARTF_USECOUNTCHARS 的值): CreateProcess("C:\\WINDOWS\\SYSTEM32\\WindowsPowershell\\V1. 0\\powershell.exe", "-File C:\\IISAppPoolConfig.ps1", IntPtr.Zero, IntPtr.Zero, false, 8, IntPtr.Zero, null, ref si, out pi);我收到一条消息说“Powershell 退出工作”。当我将 0 放回 dwFlags 部分时,它不会出错。我也将 dwXCountChars 设置为 uint.MaxValue。
  • @JoeBaltimore - 我忘了提到dwYCountChars。将其设置为 25 或几百。现在回到dwXCountChars:两个千兆字节的控制台行可能太宽了,从 30K 开始,看看包括脚本在内的所有组件是否都适合。
  • 结果没有变化。我创建 STARTUPINFO si = new STARTUPINFO {dwXCountChars = 200, dwYCountChars = 25};并像我之前的评论一样调用 CreateProcess。 “Powershell 已停止工作”。如果我按如下方式调用 CreateProcess,它不会出错: CreateProcess("C:\\WINDOWS\\SYSTEM32\\cmd.exe", "/c C:\\WINDOWS\\SYSTEM32\\WindowsPowershell\\V1.0\ \powershell.exe -File \"C:\\Program Files\\rPath\\rSPU\\read.d\\IISAppPoolConfig.ps1\"", IntPtr.Zero, IntPtr.Zero, false, 8, IntPtr.Zero,空,参考 si,出 pi);现在,如何获取标准输出
  • 新信息...在 Powershell 脚本中使用 Write-Host 不会在字符串的第 80 个位置产生 0D0A 字符。
  • @JoeBaltimore - 恭喜。获取输出的两种方法 - CreatePipe 并在 STARTUPINFO.hStdOut 中提供句柄,或者在 cmd.exe 命令行上使用命令重定向 (&gt; C:\mystdout.txt)
【解决方案2】:

目前的最终和经过测试的解决方案(因为我需要交付一些东西)是让 powershell 的输出来自 Write-Host cmdlet 而不是 Write-Output。获取标准输出的过程和我原来的帖子一样。希望这对其他人有帮助。感谢所有输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    相关资源
    最近更新 更多