使用C#根据文本文件中的行进行决策
本文关键字:决策 文件 文本 使用 | 更新日期: 2023-09-27 17:59:38
我需要编写一个C#控制台应用程序,它可以被调度任务调用。我需要做的是比较两个日期的文本文件。一个文件的日期将多于另一个。应用程序需要将日期列表与当前日期进行比较,并根据该日期运行批处理文件。
如果文件a中的日期等于今天的日期,那么查看文件B,查看文件B中是否包含今天的日期。如果它在文件B中,则运行批处理文件"B"。如果今天的日期没有列在文件B中,而是在文件A中,则运行批处理文件"A"。如果两个文本文件中都没有列出今天的日期,则不执行任何操作。
例如:文件A的日期为,2015年1月1日2015年8月1日2015年1月15日2015年1月22日2015年1月29日
文件B的日期为,2015年1月15日2015年2月15日2015年3月15日
假设今天是2015年1月15日。应用程序检查文件A并查看今天的日期是否存在。然后继续检查文件B,并发现今天的日期退出,因此运行批处理文件"B"。如果今天的日期不在文件B中,它将运行批处理文件"A"。
如果今天是2015年1月31日,则两者都不是真的,也不会运行任何批处理文件。
这就是我到目前为止所拥有的。Fyi。。。我是C#的新手,也是编程的新手。提前感谢您的帮助。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;
namespace Automate_Script
{
class Program
{
// get today's date
private static DateTime today = DateTime.Today;
// create the string arrays to hold the dates from the text files. Initialize to null.
private static string[] dateLinesWeek = null;
private static string[] dateLinesMonth = null;
static void Main(string[] args)
{
// display today's date in console window.
Console.WriteLine("'n't'tToday is {0}", today.ToString("d"));
// attempts to read the 'weekDates' text file.
try
{
// this is the text file that contains the dates for week-end run dates.
dateLinesWeek = File.ReadAllLines(@"C:'MyScripts'weekDates.txt");
dateLinesMonth = File.ReadAllLines(@"C:'MyScripts'monthDates.txt");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
// create the process to run the batch execution.
Process p = new Process();
// iterate through the 'weekDates' text file
foreach (var weekLine in dateLinesWeek)
{
if (Convert.ToDateTime(weekLine) == today)
{
foreach (var monthLine in dateLinesMonth)
{
if (Convert.ToDateTime(monthLine) == today && Convert.ToDateTime(weekLine) == today)
{
try
{
string targetDirectory;
targetDirectory = string.Format(@"C:'MyScripts");
p.StartInfo.UseShellExecute = true;
p.StartInfo.WorkingDirectory = targetDirectory;
p.StartInfo.FileName = "monthTest.bat";
p.StartInfo.CreateNoWindow = false;
p.Start();
p.WaitForExit();
System.Threading.Thread.Sleep(3000);
}
catch (Exception ex)
{
Console.WriteLine("Exception Occurred: {0}, {1}", ex.Message, ex.StackTrace.ToString());
}
}
else
{
return;
}
}
}
else
{
try
{
string targetDirectory;
targetDirectory = string.Format(@"C:'MyScripts");
p.StartInfo.UseShellExecute = true;
p.StartInfo.WorkingDirectory = targetDirectory;
p.StartInfo.FileName = "weekTest.bat";
p.StartInfo.CreateNoWindow = false;
p.Start();
p.WaitForExit();
System.Threading.Thread.Sleep(3000);
}
catch (Exception ex)
{
Console.WriteLine("Exception Occurred: {0}, {1}", ex.Message, ex.StackTrace.ToString());
}
break;
}
}
Console.ReadLine();
//System.Threading.Thread.Sleep(3000);
}
}
}
我已经尝试了上述代码的许多变体,结果基本相同。我通常只能运行每周的脚本。
我认为您的代码不能正常工作的原因是
else
{
return;
}
如果今天的日期不在月份文件的第一行,则应用程序将退出。
如果我理解你的要求,你应该执行:
- 如果A.txt文件中存在今天的日期,请编写A.bat脚本
- 如果文件A.txt和B.txt中存在今天的日期,请编写B.bat脚本
如果是这样的话,我会做下面这样的事情。如果我误解了您的要求,您可能需要更改运行什么脚本的条件。
namespace Automate_Script
{
class Program
{
static void Main(string[] args)
{
DateTime today = DateTime.Today;
// display today's date in console window.
Console.WriteLine("'n't'tToday is {0}", today.ToString("d"));
if (!FileContainsDate(@"C:'MyScripts'weekDates.txt", today))
return; // Todays date not present in week dates, nothing shall be done.
if (FileContainsDate(@"C:'MyScripts'monthDates.txt", today))
{
RunScript("monthTest.bat");
}
else
{
RunScript("weekTest.bat");
}
Console.ReadLine();
}
private static bool FileContainsDate(string dateFile, DateTime date)
{
try
{
string[] dates = File.ReadAllLines(dateFile);
return dates.Any(line => Convert.ToDateTime(line) == date);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
}
private static void RunScript(string scriptFile)
{
try
{
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.WorkingDirectory = @"C:'MyScripts";
p.StartInfo.FileName = scriptFile;
p.StartInfo.CreateNoWindow = false;
p.Start();
p.WaitForExit();
System.Threading.Thread.Sleep(3000);
}
catch (Exception ex)
{
Console.WriteLine("Exception Occurred: {0}, {1}", ex.Message, ex.StackTrace.ToString());
}
}
}
}
首先,我会对您的场景进行一点不同的描述:如果当前日期在文件B中,则执行monthTest.bat。如果不在,则检查它是否在文件a中,然后执行weekTest.bat;如果不在其中任何一个中,则不执行任何操作。
您可以使用LINQ查询数组中是否存在您的日期:
var fileToRun = string.Empty;
if (dateLinesMonth.Any(x => Convert.ToDateTime(x) == today)
{
fileToRun = "monthTest.bat";
}
else if (dateLinesWeek.Any(x => Convert.ToDateTime(x) == today)
{
fileToRun = "weekTest.bat";
}
if (!string.IsNullOrEmpty(fileToRun))
{
// create and run process
}
好的,所以我认真简化了您的内容,并将您的字符串数组转换为列表。我还删掉了你从文件中读到的内容,因为我不想把它放在小提琴里。这是另一种方法。
您可以在dotfiddle上看到以下代码。https://dotnetfiddle.net/QYjoqw
public static void Main()
{
var today = "1/8/2015";
// create the string arrays to hold the dates from the text files. Initialize to null.
List<string> dateLinesWeek = null;
List<string> dateLinesMonth = null;
// this is the text file that contains the dates for week-end run dates.
dateLinesWeek = new List<string>() {
"1/1/2015",
"1/8/2015",
"1/15/2015",
"1/22/2015",
"1/29/2015"
};
dateLinesMonth= new List<string>()
{
"1/15/2015",
"2/15/2015",
"3/15/2015"
};
if (dateLinesMonth.Contains(today))
{
Console.WriteLine("Execute B");
}
else if(dateLinesWeek.Contains(today))
{
Console.WriteLine("Execute A");
}
您在这个问题中选择了batch-file
标记,所以我发布了一个批处理文件解决方案(它比C#简单得多)。
@echo off
setlocal
rem Get today's date and eliminate left zeros in each part
set today=%date:/0=/%
rem If there's a date in file A that's equal to today's date...
findstr /L "%today%" A.txt > NUL
if not errorlevel 1 (
rem then look at file B to see if today's date is contained in file B.
findstr /L "%today%" B.txt > NUL
rem If it is in file B...
if not errorlevel 1 (
rem run batch file "B"
call B.bat
) else (
rem run batch file "A"
call A.bat
)
)
rem If today's date is not listed in file A, do nothing