Ваше определение последней строки отличается от моего. Пара символов <CarriageReturn><LineFeed>
завершает строку. В конце вашего файла у вас есть строка, которая заканчивается, и ничего после нее. Если вы откроете файл в текстовом редакторе и перейдете в конец файла, курсор окажется на пустой строке. Но эта строка не является частью текущего файла. На мой взгляд, последняя строка - это строка выше.
Вы можете использовать FIND для определения количества строк. FIND также не считает, что после последней строки должен стоять символ. Затем используйте FINDSTR, чтобы поставить перед каждой строкой номер строки, переданный второй FINDSTR, чтобы отфильтровать «последнюю» строку. Цикл FOR считывает выходные данные, а поиск и замена SET удаляет префикс номера строки. Задержанное расширение включается и выключается в цикле, чтобы защитить его от повреждения !
, если оно обнаружено в содержимом файла во время расширения переменной %% L.
@echo off
setlocal disableDelayedExpansion
set file="test.txt"
for /f %%N in ('find /c /v "" ^<%file%') do set skip=%%N
(
for /f "delims=" %%L in ('findstr /n "^" %file%^|findstr /v "^%skip%:"') do (
set "ln=%%L"
setlocal enableDelayedExpansion
echo(!ln:*:=!
endlocal
)
)>%file%.new
move %file%.new %file% >nul
После запуска приведенного выше кода желаемая строка будет удалена. Последняя строка будет по-прежнему завершена, поэтому текстовый редактор будет по-прежнему отображать пустую строку после конца файла.