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:)