2011-02-06 6 views
2

мне нужна помощь меняющийся диапазон дат в строке 13 файла:Пакетный сценарий, который может обновить файл с диапазоном дат

01/01/201101/31/2011 

Я планирую настройки скрипта для запуска каждый день с планировщиком окон ,

Я хочу, чтобы сценарий изменил начальную дату -15 дней с текущей даты и дату окончания +15 дней с текущей даты.

Я нашел DateAdd.cmd, написанный Роб ван дер Вуде (http://www.robvanderwoude.com) , но я не уверен, как передать значения обратно на мой основной (вызывающий) скрипт?

+0

Не то, что вы делаете с файлом из командного файла, вы потеряете пустые строки. Если это важно, вам не повезло. Однако это может быть проще в VBS, которое также включено почти в каждую последнюю версию Windows. – Joey

ответ

0

Язык пакетных файлов не был значительно обновлен десятилетиями. Вы все еще не можете сделать обычный цикл for. Предлагаю посмотреть на PowerShell. Это так же мощно (если не больше), чем языки оболочки * nix, но также может использовать всю платформу .NET. Если вы используете PowerShell, эта проблема будет столь же просто, как

  1. Открыть файл, перейдите к строке 13
  2. Разобрать строку, как две даты
  3. Вычесть 15 дней от одного объекта даты и добавьте 15 к следующему
  4. Запись файла обратно из

Тот факт, что вы пытаетесь сделать реальное программирование в пакетном файле поистине почетно (я бы совершил Seppuku). Попытайтесь переключиться на более мощный язык оболочки, который больше завершен. Кроме того, PowerShell - это будущее сценариев Windows.

+0

:) ... падающий на меч .... – treeSeeker

+0

Серьезный, хотя, получить с powershell или seppuku – kelloti

+0

Это совершенно неправильно в отношении 'for' петель. – Joey

1

без какой-либо ~ ~ партия помощи, я сделал следующее в C#:

static void Main(string[] args) 
    { 
    string inputFile = Path.Combine("C:/temp","textfile.txt"); 
    string outputFile = Path.Combine("C:/temp","textfile2.txt"); 


    using(StreamReader input = File.OpenText(inputFile)) 
    using(Stream output = File.OpenWrite(outputFile)) 
    using(StreamWriter writer = new StreamWriter(output)) 
    { 
     int count = 1; 
     while(!input.EndOfStream) 
     { 
      // read line 
      string line = input.ReadLine(); 
      // Get dates 15 days on either side of current date 
      if(count == 13) 
      { 
       DateTime beginRange = DateTime.Today.AddDays(-15); 
       DateTime endRange = DateTime.Today.AddDays(15); 
       string strBeginDate = beginRange.ToShortDateString(); 
       string strEndDate = endRange.ToShortDateString(); 

       // replace line with new date range 
       line = "0001" + strBeginDate + strEndDate + "Report submitted by"; 
      } 
      // increment counter 
      count++; 

      // write the file to temp file 
      writer.WriteLine(line); 
     } 
    } 
    File.Delete(inputFile); // delete original file 
    File.Move(outputFile,inputFile); // rename temp file to original file name 
+0

молодец. Простая C# -программа может упростить пакетный скриптинг ... – kelloti

0

Я нашел DateAdd.cmd написанные Роб ван дер Woude (http://www.robvanderwoude.com) но я не уверен, как передать значения обратно на мой главный (вызывающий) скрипт?

Я согласен с другими, что вы лучше использовать другой язык сценариев (VBS, PowerShell, ...), но для ответа на этот конкретный вопрос, пакетный файл DateAdd.cmd устанавливает переменные окружения DATEADD к результатам его обсуждений.

Вы можете сделать что-то вроде:

CALL DATEADD -15 >NUL: 
SET FROMDATE=%DATEADD% 
CALL DATEADD 15 >NUL: 
SET TODATE=%DATEADD% 
echo %FROMDATE%%TODATE% 

Обратите внимание, что DateAdd.cmd использует короткий формат даты текущего пользователя из реестра, поэтому будут давать различные результаты в зависимости от локали пользователя.

Смежные вопросы