Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重定向输入&;使用C从批处理文件调用的可执行文件的输出#_C#_Batch File_Io Redirection_Vivado - Fatal编程技术网

C# 重定向输入&;使用C从批处理文件调用的可执行文件的输出#

C# 重定向输入&;使用C从批处理文件调用的可执行文件的输出#,c#,batch-file,io-redirection,vivado,C#,Batch File,Io Redirection,Vivado,我正在努力实现的目标: 一个简单的c#类,用于向Xilinx Vivado应用程序发送和接收TCL命令。vivado中已经有一个内置的TCL shell控制台,它所做的只是调用一个批处理文件(vivado.bat),并使用一些参数(-mode TCL)。此批处理文件的工作方式如下: ==vivado.bat== @echo off setlocal set ... *configure a few environment variables.. call my

我正在努力实现的目标:

一个简单的c#类,用于向Xilinx Vivado应用程序发送和接收TCL命令。vivado中已经有一个内置的TCL shell控制台,它所做的只是调用一个批处理文件(vivado.bat),并使用一些参数(-mode TCL)。此批处理文件的工作方式如下:

==vivado.bat==



    @echo off
    setlocal
    set ... *configure a few environment variables..
    call myBatchFile#1.bat
    set ... *configure a few environment variables..
    call myBatchFile#2.bat
    set ... *configure a few environment variables..
    call myBatchFile#3.bat
    exit

其中myBatchFile#1.bat和myBatchFile#2.bat设置了更多的环境变量,myBatchFile#3.bat在内部调用第四批文件(myBatchFile#4.bat),最终启动可执行文件:

==myBatchFile#4.bat===

问题

无论使用START/CALL/CMD(带参数:/b/c/i/k/wait)的哪种组合启动“Vivado.bat-mode tcl”文件,我都无法让我的应用程序正常工作。我确信输出已被正确重定向,因为我将“splash”文本输入到我的outputBuffer变量中,控制台通常在加载时输出该变量。但即使在那之后,使用



    VivadoConsole.StandardInput.WriteLine(str);

什么也不做。我注意到,如果我不重定向输入并直接在应用程序控制台窗口中键入,它会起作用(尽管我必须键入每个命令两次)。在我看来,重定向批处理文件中的输入并没有按预期工作(我尝试了几种端点字符的组合,但也没有工作)

老实说,我不知道我遗漏了什么或我做错了什么,但我唯一的选择是手动加载每个环境变量,然后调用exe文件,所有这些都来自同一个控制台窗口(尽管我不确定这是否可行…)

我更喜欢任何不需要修改批处理文件的解决方案,因为它是第三方应用程序。但是,如果不修改批处理文件就不可能做到这一点,那么它也将受到欢迎


提前感谢。

参数必须以
/C
开头:
VivadoConsole.StartInfo.arguments=“/C start/b/wait\”vivado\“..
从图片中去掉c,如果从批处理脚本中的文件重定向IO会发生什么情况?因为应用程序可以知道其输入何时被重定向,所以您可能是SOL。或者您可能必须使用MS新的伪控制台API()。我唯一的其他选择是手动加载每个环境变量,然后调用exe文件——对我来说,tbh,这似乎是一种更好的方法,您可以使用find/replace将批处理文件转换为c#,winHi@Aacini,在参数行乞时添加/C根本没有帮助,同样的行为(我从启动屏幕上获得“加载”文本,但每当我向其写入时,我都没有得到响应)。。。


    public Process VivadoConsole = new Process();
    private Queue _OutputBuffer = new Queue();
    private string _ErrorBuffer;
    
    VivadoConsole.StartInfo.FileName = "cmd.exe";
    VivadoConsole.StartInfo.Arguments = "START /b /wait \"vivado\" CMD /s /c \"vivado.bat -mode tcl\"";
    VivadoConsole.StartInfo.WorkingDirectory = @"C:\Xilinx\Vivado\2019.1\bin";
    VivadoConsole.StartInfo.UseShellExecute = false;
    VivadoConsole.StartInfo.RedirectStandardOutput = true;
    VivadoConsole.StartInfo.RedirectStandardError = true;
    VivadoConsole.StartInfo.RedirectStandardInput = true;
    VivadoConsole.StartInfo.Verb = "runas";
    VivadoConsole.StartInfo.ErrorDialog = false;
    
    VivadoConsole.OutputDataReceived += (object sender, DataReceivedEventArgs e) =>
    {
       if (!String.IsNullOrEmpty(e.Data))
       {
          _OutputBuffer.Enqueue(e.Data);
       }
    };
    VivadoConsole.ErrorDataReceived += (object sender, DataReceivedEventArgs e) =>
    {
       _ErrorBuffer += e.Data;
    };
    VivadoConsole.EnableRaisingEvents = true;
    
    
    VivadoConsole.Start();
    VivadoConsole.BeginOutputReadLine();
    VivadoConsole.BeginErrorReadLine();
    _OutputBuffer.Clear();



    VivadoConsole.StandardInput.WriteLine(str);