有几种简单的方法可以解决这个问题。一是按你的要求做;将输入文本写入名为“textbox1.text”的文件(实际上应该是“textbox1.txt”,因为“.txt”是文本文件的通用后缀,而“.text”不是),然后让批处理脚本读取它。
使用Console.WriteLine() 将文本简单地写入标准输出流并让批处理文件捕获它并使用文本执行它想要的操作要容易得多。无论哪种方式,您都需要一个已知 永远不会成为输入字符的字符。
我将以第二种方法为例,但我不会使用 Forms 或 WPF。很难显示什么去哪里。不过,您似乎想要一个带有文本框的窗口,所以我将使用以下“ConsoleApp1.cs”程序并从 Visual Basic 中借用 InputBox() 函数(一个简洁的控制台 CS 技巧!):
using System;
using Microsoft.VisualBasic;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string answer = Interaction.InputBox("Tell me something");
Console.WriteLine(answer);
}
}
}
将其编译成 .exe 文件并将其复制到您用于运行 .bat 文件的目录中。现在在批处理文件中尝试以下操作:
rem @echo off
for /F "delims=~" %%t in ('ConsoleApp1.exe') do set a=%%t
echo.%a%
这是从 CS 程序中获取一行文本到调用它的 .bat 文件中的简单方法。如果您坚持让 CS 程序创建一个名为“textbox1.text”的文本文件,请继续。查找如何使用 StreamWriter 类来做到这一点。然后你的.bat 文件将使用稍微不同的FOR 命令形式:
for /F "delims=~" %%t in (textbox1.text) do set a=%%t
无论哪种方式,您都需要delims= 之后的字符是用户不会键入的分隔符。 FOR /F 命令始终将输入行解析为由您指定的任何分隔符(或默认为空格)分隔的标记。我使用 ~ 或 ' 作为通常不会出现在命令或文件名中的字符。
Justaus3r 提出了一个有价值的建议,即使用重定向的SET /P 命令。您可以使用它,通过上面的 CS 程序将Console.WriteLine 输出到一个变量中,而无需担心分隔符:
ConsoleApp1.exe >textbox1.text
set /P a=<textbox1.text
这行得通。将 ConsoleApp1 的输出直接传输到 SET 也应该可以工作,但由于某种原因它不能。我在 Win7 中工作但在 Win10 中没有的旧批处理文件遇到了许多问题。但是,这在 CMD 和 PowerShell 中都失败了,因此 MS 不再维护 CMD 发生了一些奇怪的事情。