我想从bat文件中读取特定数据(设置值),然后将它们写入Textbox1.Text(这些是我想要读取的第一行文件),我想得到值
XXXXX写入Textbox1.Text
YYYYY写入Textbox2.Text
ZZZZZ写入Textbox3.Text
SSSSS写入Textbox4.Text
@echo off
:::::: DANE LOGOWANIA DO BAZY DANYCH
:: Baza danych
set DB=XXXXX
:: Serwer Bazy danych
set DBServer=YYYYY
:: Login do bazy danych
set DBUser=ZZZZZ
:: Hasło do bazy danych
set DBPassword=SSSSS
应从
触发从文件中读取 private void mssqlbutton_Click(object sender, EventArgs e)
{
}
然后,如果有人更改Textbox1.Text
值,则会将这些值写入先前读取的位置的文件中。
我尝试使用正则表达式找到解决方案,按行阅读,但它对我不起作用,或者我根本不知道怎么做。
准确地说,我只是用C#开始我的冒险,我还不熟悉它,所以如果你能向我解释而不是只提供代码我将不胜感激:)
编辑: 实际上它不是那么小,整个bat文件是这样的: http://wklej.to/sCQ6i (我知道最后的bat文件删除日志文件,但我会处理它)
和AppCode: http://wklej.to/Z5IFd
AppCode中的位置
DBServerInput.Text was Textbox1.Text
DBInput.Text was Textbox2.Text
DBUserInput.Text was Textbox3.Text
DBPasswordInput was Textbox4.Texte
答案 0 :(得分:2)
那么你被困在哪里?但是,第一个要求相对容易:
private void ButtonReadBatch_Click(object sender, EventArgs e)
{
string[] linesToShowInTextBox = File.ReadLines(@"C:\Temp\batchTest.bat")
.Select(l => l.Trim())
.Where(l => l.StartsWith("set ", StringComparison.InvariantCultureIgnoreCase) && l.Contains('='))
.Select(l => l.Split('=').Last().TrimStart())
.ToArray();
TextBox1.Lines = linesToShowInTextBox;
}
第二个更复杂,这应该给你一个想法。它初步进行了测试:
private void ButtonSumbitTextboxChangesToBatch_Click(object sender, EventArgs e)
{
string[] lines = textBox1.Lines;
if (lines.Length != 0)
{
int matchIndex = 0;
var lineInfos = File.ReadLines(@"C:\Temp\batchTest.bat")
.Select(l => l.Trim())
.Select((line, index) => {
bool isSetLine = line.StartsWith("set ", StringComparison.InvariantCultureIgnoreCase) && line.Contains('=');
return new{
line, index, isSetLine,
setIndex = isSetLine ? matchIndex++ : -1
};
});
string[] newLines = lineInfos
.Select(x => !x.isSetLine || x.setIndex >= lines.Length
? x.line
: string.Format("set {0}={1}",
x.line.Split(' ')[1].Split('=')[0].Trim(),
lines[x.setIndex]))
.ToArray();
File.WriteAllLines(@"C:\Temp\batchTest.bat", newLines);
}
}
所以不要使用TextChanged
事件而是另一个按钮,否则会在任何导致不良影响的更改时调用该事件。
答案 1 :(得分:0)
您可以使用System.IO.File-class及其静态方法从文件中读取数据。特别是Method ReadAllLines 应该可以帮到你。因此,您可以遍历行或使用索引来寻址。 foreach 和 for 循环应该有效。 String-class为您提供解构数据读取的工具,考虑使用方法拆分或 IndexOf 。 也可以使用 System.IO.File -class将数据写回文件。最简单的方法应该是用所有值覆盖整个文件,因为数据量非常低。考虑使用 System.IO.File -class中的 AppendLine -Method。
给定的MSDN-Links应该为您的研究提供一个良好的起点。我不会发布代码,因为你说你想为自己进行冒险; - )
答案 2 :(得分:0)
我在正则表达式中很弱,这段代码string pattern = @"=(?<after>\w+)";
是匹配等号=
之后的单词,如果有一些专家表现出更好的方法,那就更好了:D
string txtBatFile= "<physical path for batfile>";
if (File.Exists(txtBatFile))
{
StreamReader SR = new StreamReader(txtBatFile);
string strFileText= SR.ReadToEnd();
SR.Close();
SR.Dispose();
string pattern = @"=(?<after>\w+)";
MatchCollection matches = Regex.Matches(strFileText, pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase);
ArrayList _strList = new ArrayList();
foreach (Match match in matches)
{
_strList.Add(match.Groups["after"].ToString());
}
Textbox1.Text = _strList[0].ToString();
Textbox2.Text = _strList[1].ToString();
Textbox3.Text = _strList[2].ToString();
Textbox4.Text = _strList[3].ToString();
}