用C#编写的Windows控制台应用程序如何确定它是在非交互式环境中调用(例如从服务或作为计划任务)还是从能够进行用户交互的环境(例如命令提示符或PowerShell)调用?
我有一个第三方DOS进程,它将有关其进度的数据写入命令行.我想对进展做出反应.通常我会用一个Process带RedirectStandardOutput = true和RedirectStandardError = true再
.OutputDataReceived +=xyzOutputDataReceived;
.ErrorDataReceived += xyzErrorDataReceived;
.Start();
.BeginOutputReadLine();
.BeginErrorReadLine();
Run Code Online (Sandbox Code Playgroud)
通常这是有效的.我得到了我需要的DataReceivedEventArg.
在这种情况下,该过程似乎更新了它所写的相同行(这怎么可能?),因此它将15%,15%的更改写入18%,依此类推.只有在执行结束时,似乎才将数据刷新到StandardOutput.
此外,如果我只是尝试将数据传输到文本文件(例如odb.exe >> output.txt),它什么都不显示.
有没有办法获取临时数据?
问题不在于获得标准输出,这可以正常工作(同步和异步).它是关于如何从一个我无法改变的进程中获取输出,并且似乎没有将它的输出刷新到标准流.
如何在该进程仍在运行时运行命令行进程并获取输出?
我的意思是使用自己的进度条运行CLI进程,可执行文件本身需要很长时间才能完成操作,因此我想从自己的进程中获取进度信息以显示应用程序的进度,其他方式我不知道t有任何信息显示进度,直到过程结束.
我在WindowsForm项目中工作,而不是控制台应用程序.
我尝试使用FFMPEG.exe(x64)做同样的事情,我可以在FFMPEG运行时读取"进度",我可以从FFMPEG中选择进度并做我想要的,但是使用这个可执行文件我就是不能这样做,我不知道是否可能.
该程序是"dbPowerAmp CoreConverter",它是一个音乐转换器,我认为该程序以Unicode编码发送所有输出,因为要读取我需要将输出编码设置为Unicode的输出.
...其他问题是我找不到一种方法来读取此过程的StandardError输出,即使使用Unicode,所以如果有人可以帮助我解决这两个问题.
这是应用程序:http://www.dbpoweramp.com/install/dMC-R14.4-Ref-Trial.exe
以下是直接从CMD启动的程序的示例输出:

(我需要的是在进程运行时选择进度条"*"星号字符数量来计算并在我的应用程序中显示该百分比)
这是我的代码:
Private Shared CoreConverter As New Process()
Private Shared CoreConverter_Info As New ProcessStartInfo() With { _
.CreateNoWindow = True, _
.UseShellExecute = False, _
.RedirectStandardOutput = True, _
.RedirectStandardError = True _
}
Private Shared Sub Run_CoreConverter()
' Just for testing CMD Unicode output:
'
' CoreConverter_Info.FileName = "cmd"
' CoreConverter_Info.Arguments = "/U /C C:\CoreConverter.exe " & CoreConverter_Info.Arguments
CoreConverter_Info.FileName = "C:\CoreConverter.exe"
CoreConverter_Info.Arguments = String.Format("-infile=""{0}"" -outfile=""{1}"" -convert_to=""mp3 (Lame)""" …Run Code Online (Sandbox Code Playgroud) 这可能是完全不可能的,但我想知道是否有办法读取控制台已经打印的值.例如,如果控制台打印
你以10米/秒的速度向北行驶
因此Console.WriteLine("You are travelling north at a speed of 10m/s");,有没有办法读取这一行,然后,为了论证,将这个值放在一个字符串中?
基本上我需要的是读取已经输出到控制台的内容,而不是用户输入.有办法吗?
提前致谢.