Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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#_Windows_Batch File - Fatal编程技术网

C# 在c中以批处理文件的形式运行字符串#

C# 在c中以批处理文件的形式运行字符串#,c#,windows,batch-file,C#,Windows,Batch File,我正在编写一个应用程序,创建一个批处理文件,然后运行: 我知道我可以创建一个批处理文件 没问题 我想做的是: 一旦创建了生成文件的字符串,是否有任何方法将字符串作为批处理文件执行? 差不多 string BatchFile = "echo \"bla bla\" \n iperf -c 123 ... ... .. " Diagnostics.Process.Start(BatchFile); 您可以将/c作为可执行文件运行CMD.EXE,并将其余部分作为参数: Process.Start(

我正在编写一个应用程序,创建一个批处理文件,然后运行:

我知道我可以创建一个批处理文件 没问题

我想做的是: 一旦创建了生成文件的字符串,是否有任何方法将字符串作为批处理文件执行? 差不多

string BatchFile = "echo \"bla bla\" \n iperf -c 123  ... ... .. "
Diagnostics.Process.Start(BatchFile);

您可以将/c作为可执行文件运行CMD.EXE,并将其余部分作为参数:

Process.Start("cmd.exe", "/c echo \"bla bla\" \n iperf -c 123  ... ... .. ");

对我来说,我使用的是以下代码:

Process process;
        private void button1_Click(object sender, EventArgs e)
        {
            process = new Process();
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.FileName = "cmd";
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardInput = true;
            process.Start();
            BackgroundWorker worker = new BackgroundWorker();
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.RunWorkerAsync();

            process.StandardInput.WriteLine("cd d:/tempo" );
            process.StandardInput.WriteLine("dir");



        }
        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            string line;
            while (!process.StandardOutput.EndOfStream)
            {
                line = process.StandardOutput.ReadLine();
                if (!string.IsNullOrEmpty(line))
                {
                    SetText(line);
                }
            }
        }

        delegate void SetTextCallback(string text);
        private void SetText(string text)
        {
            if (this.textBox1.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.textBox1.Text += text + Environment.NewLine;
            }
        }
        private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            process.StandardInput.WriteLine("exit");
            process.Close();

        }
您可以将批处理“文件”创建为一个长字符串,其中的行以
\n
结尾,正如您在示例中所示,然后执行该字符串(我称之为“NotBatch text”),执行cmd.exe并将该字符串重定向到其标准句柄中。这样,“NotBatch text”就可以使用大量的批处理功能,如%variables%的扩展、
IF
用于嵌套在任何级别的
命令,等等。您也可以使用延迟!变量如果使用
/V:ON
开关执行cmd.exe,则展开。实际上,在NotBatch文本中唯一不起作用的是:参数和
SHIFT
命令,以及
GOTO
/
调用:label
命令;详情请参阅


如果要执行更高级的“NotBatch text”字符串,甚至可以在第三方程序的帮助下模拟
GOTO
CALL:label
命令,如所述。

,这样您就不必将文件写入磁盘了?不是。实际上是windows执行批处理文件。但是,如果要创建字符串,可以只执行单个语句。否。它之所以被称为批处理文件是有原因的。是的,你说得对(你们两个:),但我还是不得不问,实际上我期待着一些新奇的东西,比如动态或反射:)如果字符串被重定向到cmd.exe的Stdin中,那么几乎所有批处理文件功能都可以在“批处理”字符串中使用;例外情况是:批处理文件参数、
GOTO
CALL:label
命令。请参见下面的内容。如果只是一个简单的命令或几个命令,那么它就可以正常工作。尝试一个真正的、功能性的批处理文件的内容,这根本不起作用。@Robert:CMD.EXE接受的单个命令行的长度有一个限制,而且相对较短(8196个字符)。陈雷蒙写了这件事。Quote:“如果您使用的是CMD.EXE命令处理器,那么您还需要遵守CMD.EXE施加的8192个字符的命令行长度限制。”这将从批处理文件中正常执行,但不会作为单个字符串作为参数传递给CMD.EXE。@KenWhite:对,我已经知道了。虽然8192个字符相当多;我可能从来没有见过比这个更大的批处理文件(虽然我相信你见过)。这不是我想要的答案,但这是我认为我能得到的最接近的答案。这个示例不适用于所示的情况;它需要用一个符号改变所有的换行符:
&
你的答案是正确的,可能更好。但哈加R。答案更接近我的意思(但我给了你+1:)