пакетный скрипт считывает последние две строки файла журнала

#batch-file #logfile

#пакетный файл #файл журнала

Вопрос:

Я хочу прочитать последние две строки файла журнала, приведенный ниже код печатает все строки

 @echo on 
setlocal EnableDelayedExpansion 
for /f "delims=" %%x in (C:FICOtest_scriptretcodeStartClientKYC.txt) do ( 
 set "previous=!last!" 
 set "last=%%x" 
)
echo !previous! 
set var1=%previous% 
set var2=%var1:*:=% 
echo %var2% >> result1.txt
 

Может кто-нибудь, пожалуйста, скажите мне, что не так в приведенном выше коде.

Комментарии:

1. Опубликованный вами код должен выводить все после первого двоеточия, : , предпоследней строки from retcodeStartClientKYC.txt , to results.txt . Однако содержимое, кодировка и окончания строк вашего текстового файла могут вызвать у вас проблемы. Текстовый файл должен быть закодирован в кодировке UTF-8 или ANSI, а не в формате UTF-16, и должен использовать окончания строк Windows CRLF или Unix LF, а не MAC CR. Однако без содержимого fie я не могу посоветовать вам, поможет ли в этом конкретном случае включение более надежного кода, такого как двойные цитаты в строках 3 , 8 , и 9 , и отложенное расширение со скобками в строке 10 .

Ответ №1:

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

Вот моя переформатированная версия:

 @echo off
setlocal EnableDelayedExpansion 
rem for /f "delims=" %%x in (C:FICOtest_scriptretcodeStartClientKYC.txt) do ( 
for /f "delims=" %%x in (q65761009.txt) do ( 
 set "previous=!last!" 
 set "last=%%x" 
)
echo !previous! 
set "var1=%last%"
set "var2=%var1:*:=%"
echo %var2% 
GOTO :EOF
 

Примечание: вы не показали никаких образцов (если подвергнуты цензуре) исходных данных из файла журнала. Я использовал образец случайного текста, помещенный в файл с именем q65761009.txt , который подходит для моей системы.

Теперь — чтобы использовать код, скопируйте / вставьте и отредактируйте по мере необходимости в .bat файл, используя соответствующий текстовый редактор, такой как Editplus или Notepad (среди прочих) — в крайнем случае, используйте Notepad , но имейте в виду, что batch странно чувствителен к макету и Notepad имеет ужасную привычку пытаться переформатировать при сохранении. Сохранить в формате ANSI, а не в Юникоде.

К сожалению, ваши манипуляции необъяснимы. Поскольку вы его закодировали, кажется echo , что он вводит предпоследнюю строку, а затем удаляет весь текст до первого двоеточия в этой предпоследней строке и echo вводит остаток.

Поскольку вы не показали свои ожидания от результата, мы не можем быть уверены в том, что вы намеревались; но последнее кажется подозрительным. Хрустальный шар говорит мне, что вы намеревались echo использовать предпоследнюю строку ( previous ) и часть последней строки после первого двоеточия, поэтому я изменил код, чтобы сделать это.

Совет: Используйте set "var1=data" для установки значений — это позволяет избежать проблем, вызванных конечными пробелами.

Поскольку вы, по-видимому, расширяете файл, вы могли бы использовать >>filename в конце каждого соответствующего echo . Или, возможно, вы хотите создать файл заново, содержащий только данные, полученные двумя echo операторами; вы не говорите…

Но — я обнаружил, что приведенный выше код сгенерировал две строки (для консоли), как (я) и ожидал, и никаких признаков каких-либо предыдущих данных в файле.

Комментарии:

1. Хорошо, я признаю, что не понимаю вашего ответа. В первых нескольких абзацах ничего не говорится о проблеме. Не могли бы вы уточнить, в чем заключается решение? Код в вашем решении выглядит точно так же, как и в вопросе.

2. К сожалению, @Dharman, вы, похоже, не понимаете проблему. Код OP действительно работает — вероятно, это проблема с форматированием (отсюда рекомендации по редакторам и вырезанию / вставке), и есть изменения — включение set команд в кавычки и выбор соответствующей переменной для самого последнего вывода ( last вместо previous ) Возможно, вы должны увидеть исходную публикацию, которую я переформатировал в форму, которая теперь появляется. Очевидно, что если это правильное представление фактического используемого кода, это вызовет проблемы — как я и советовал. Код не «печатает все строки», что было проблемой OP.