#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. Опубликованный вами код должен выводить все после первого двоеточия,
:
, предпоследней строки fromretcodeStartClientKYC.txt
, toresults.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.