Понадобилось мне как-то выдернуть из текстового файла последнюю строку. Операционная система Windows.
Интернет выдал несколько вариантов, но все они оказались странными, то временный файл используют, то виснут на файлах большого размера. Пришлось всё это как-то соединить в один нормальный рабочий вариант.
Скрипт сохраняем в кодировке OEM 866, чтобы работали пути к файлам с кириллицей.
Вывод последней строки файла
@echo off
SetLocal EnableDelayedExpansion
:: файл
set monfile=C:\пример папки\пример файла.txt
:: Узнать количество строк в файле
for /f %%n in ( 'find /v /c "" ^< "%monfile%"' ) do (
set /a tail.count=%%n
)
:: Вычислить сколько строк пропустить
set /a tail.count-=1
:: файл в UFT8, переключимся на эту кодировку
chcp 65001 >nul
:: Вывести ns последних строк из файла
more /e +%tail.count% "%monfile%" | find /v ""
:: вернём обратно кодировку OEM 866
chcp 866 >nul
Вывод N последних строк файла
@echo off
SetLocal EnableDelayedExpansion
:: файл
set monfile=C:\пример папки\пример файла.txt
:: сколько выводим строк, в примере 5
set nn=5
:: Узнать количество строк в файле
for /f %%n in ( 'find /v /c "" ^< "%monfile%"' ) do (
set /a tail.count=%%n
)
:: Вычислить сколько строк пропустить
set /a tail.count-=%nn%
:: файл в UFT8, переключимся на эту кодировку
chcp 65001 >nul
:: Вывести nn последних строк из файла
more /e +%tail.count% "%monfile%" | find /v ""
:: вернём обратно кодировку OEM 866
chcp 866 >nul
Вывод первой строки файла
@echo off
SetLocal EnableDelayedExpansion
:: файл
set monfile=C:\пример папки\пример файла.txt
:: выводим одну строку
set nn=1
:: файл в UFT8, переключимся на эту кодировку
chcp 65001 >nul
:: вывод nn первых строк из файла
for /f "usebackq delims=;" %%i in ("%monfile%") do (
echo %%i
set /a nn=!nn!-1
if !nn!==0 goto exitfor
)
:: exit for
:exitfor
:: вернём обратно кодировку OEM 866
chcp 866 >nul
Вывод N первых строк файла
@echo off
SetLocal EnableDelayedExpansion
:: файл
set monfile=C:\пример папки\пример файла.txt
:: сколько выводим строк, в примере 5
set nn=5
:: файл в UFT8, переключимся на эту кодировку
chcp 65001 >nul
:: вывод nn первых строк из файла
for /f "usebackq delims=;" %%i in ("%monfile%") do (
echo %%i
set /a nn=!nn!-1
if !nn!==0 goto exitfor
)
:: exit for
:exitfor
:: вернём обратно кодировку OEM 866
chcp 866 >nul