使用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);
        }
    }
}

我已经尝试了上述代码的许多变体,结果基本相同。我通常只能运行每周的脚本。

使用C#根据文本文件中的行进行决策

我认为您的代码不能正常工作的原因是

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