如果使用了参数输入流,则无法获取进程标准输出

时间:2019-06-03 09:47:51

标签: windows-services docfx

我正在调试docfx工具的#448 issue

docfx.exe启动进程(wkthmltopdf),并使用输入流从stdin流中设置wkthmltopdf参数。然后,它尝试从wkhtmltopdf流中获取stdout输出。

从控制台或作为WindowsService启动docfx时,它工作正常。

但是,如果docfx作为Azure构建管道的一部分启动(使用命令行脚本),则无法从wkhtmltopdf获取输出。

我发现,如果使用命令行而不是使用stdin设置参数,则会加载输出。

这是源代码

_htmlToPdfOptions.IsReadArgsFromStdin = false; // hardcoded, I do not know how to set it using docfx parameters

using (var process = new Process
{
    StartInfo = new ProcessStartInfo
    {
        UseShellExecute = false,
        RedirectStandardInput = _htmlToPdfOptions.IsReadArgsFromStdin,
        RedirectStandardOutput = _htmlToPdfOptions.IsOutputToStdout,
        WindowStyle = ProcessWindowStyle.Hidden,
        FileName = Constants.PdfCommandName,
        Arguments = _htmlToPdfOptions + (_htmlToPdfOptions.IsReadArgsFromStdin ? string.Empty : (" "+arguments)), // space is required
    }
})
{
    using(new LoggerPhaseScope(Constants.PdfCommandName))
    {
        Logger.LogVerbose($"Executing {process.StartInfo.FileName} {process.StartInfo.Arguments} ({arguments})");
        process.Start();
        if (_htmlToPdfOptions.IsReadArgsFromStdin)
        {
            using (var standardInput = process.StandardInput)
            {
                standardInput.AutoFlush = true;
                standardInput.Write(arguments);
            }
        }
        if (_htmlToPdfOptions.IsOutputToStdout)
        {
            using (var standardOutput = process.StandardOutput)
            {
                standardOutput.BaseStream.CopyTo(stream);
            }
            if (stream.CanSeek)
                Logger.LogVerbose($"got {process.StartInfo.FileName} output {stream.Length}Bytes");
        }
        process.WaitForExit(TimeoutInMilliseconds);
    }
}

因此,从Azure构建管道启动docfx时,将无法获得wkhtmltopdf的输出。

_htmlToPdfOptions.IsReadArgsFromStdin = false;此行经过硬编码,使其可以在Windows服务中使用。它更改了提供wkhtmltopdf参数和不使用stdin的方式。

在Azure Build管道中是否有任何变通办法将stdinstdout用于同一过程?

我尝试使用process.StandardOutput.ReadToEnd();,但是没有运气。如果将stdin用作输入参数,它将返回空字符串。如果使用命令行设置了参数,则效果很好。

致谢

0 个答案:

没有答案