Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Как удалить последнюю строку в текстовом файле?

Ответить
Настройки темы
CMD/BAT - [решено] Как удалить последнюю строку в текстовом файле?

Новый участник


Сообщения: 32
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: ivanxam
Дата: 20-02-2014
Описание: Дописал
Добрый день, люди добрые помогите, что-то я вообще запутался.
Как удалить последнюю строку в файле? Строку эту я знаю.

Файл 100001.txt
Код: Выделить весь код
20140201.jrn
20140202.jrn
20140203.jrn
20140204.jrn
20140205.jrn
20140206.jrn
20140207.jrn
20140208.jrn
20140209.jrn
20140210.jrn
Или можно выполнить dir без последней строки(файла)

Отправлено: 16:03, 20-02-2014

 

Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Можно извратиться вот так, при этом последнее имя файла из Dir не попадёт в текстовый файл
Код: Выделить весь код
@Echo Off

Set "File=100001.txt"
Set "Mask=20??????.jrn"

SetLocal EnableExtensions EnableDelayedExpansion

Set "String='"
FOR /F "usebackq delims=" %%i in (`Dir "%Mask%" /b /A:-D /O:N 2^>nul`) Do If !String!==' (Set "String=%%i"&Del "%File%" 2>Nul) Else (Echo !String!>>"%File%"&Set "String=%%i")
Или, чтобы легче читалось, то же самое
Код: Выделить весь код
@Echo Off

Set "File=100001.txt"
Set "Mask=20??????.jrn"

SetLocal EnableExtensions EnableDelayedExpansion

Set "String='"
FOR /F "usebackq delims=" %%i in (`Dir "%Mask%" /b /A:-D /O:N 2^>nul`) Do (
	If !String!==' ( 
		Set "String=%%i"
		Del "%File%" 2>Nul
	) Else (
		Echo !String!>>"%File%"
		Set "String=%%i"
	)
)
Или, если вернуться к изначальной теме "Как удалить последнюю строку в текстовом файле?", то на этой же идее
Код: Выделить весь код
@Echo Off

Set "File=100001.txt"

SetLocal EnableExtensions EnableDelayedExpansion

Set "String='"
FOR /F "usebackq delims=" %%i in (`Type "%File%"`) Do If !String!==' (Set "String=%%i"&Del "%File%" 2>Nul) Else (Echo !String!>>"%File%"&Set "String=%%i")

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 21-02-2014 в 20:13.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:51, 21-02-2014 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


"Немного экзотики"...

Использование команды "fc":

Код: Выделить весь код
@echo off
set text_file=100001.txt
for /f %%i in ('find /c /v ""^<"%text_file%"') do set /a n=%%i-1
>nul copy nul 0.tmp
>1.tmp fc /lb%n% 0.tmp "%text_file%"
>2.tmp<1.tmp more +4
>3.tmp<2.tmp find /v "*****"
del 0.tmp 1.tmp 2.tmp
>nul move "%text_file%" "%text_file%.bak"
>nul move 3.tmp %text_file%
Жаль только, что слишком длинные строки команда "fc" располагает в несколько строк.

В случае использования только двух временных файлов в конце переписанного файла будут две лишние пустые строки:

Код: Выделить весь код
@echo off
set text_file=100001.txt
for /f %%i in ('find /c /v ""^<"%text_file%"') do set /a n=%%i-1
>nul copy nul 0.tmp
fc /lb%n% 0.tmp "%text_file%"| more +4|>1.tmp find /v "*****"
del 0.tmp
>nul move "%text_file%" "%text_file%.bak"
>nul move 1.tmp %text_file%

Отправлено: 20:19, 21-02-2014 | #12


Пользователь


Сообщения: 102
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата megaloman:
)
Или, если вернуться к изначальной теме "Как удалить последнюю строку в текстовом файле?", то на этой же идее
Код: Выделить весь код
@Echo Off
Set "File=100001.txt"
SetLocal EnableExtensions EnableDelayedExpansion
Set "String='"
FOR /F "usebackq delims=" %%i in (`Type "%File%"`) Do If !String!==' (Set "String=%%i"&Del "%File%" 2>Nul) Else (Echo !String!>>"%File%"&Set "String=%%i")
»
День добрый, данный батник хорошо работает, если обрабатывать только один файл

вопрос, а как его подправить, что бы он обрабатывал несколько файлов?

Отправлено: 10:05, 14-09-2018 | #13


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Anufriev, Неужели это я писал? Задача решалась применительно к конкретной ситуации (это я свою совесть успокаиваю). Боюсь, возможны косяки, если есть пустые строки и всякие спецсимволы.
Цитата Anufriev:
что бы он обрабатывал несколько файлов? »
- не понимаю, что за файлы и где, как имена задаются.
Если тупо и не думать, организуем процедуру и в неё будем передавать имена файлов
Код: Выделить весь код
@Echo Off
	SetLocal EnableExtensions EnableDelayedExpansion
	Call :LastDel "100001.txt" 
	Call :LastDel "D:\тра ля ля\1200001.txt" 
	Call :LastDel "\\Server\Share\ogogo.ini" 
GoTo :Eof

:LastDel
	Set "File=%~1"
	Set "String='"
	FOR /F "usebackq delims=" %%i in (`Type "%File%"`) Do If !String!==' (Set "String=%%i"&Del "%File%" 2>Nul) Else (Echo !String!>>"%File%"&Set "String=%%i")
GoTo :Eof
Не тестировал.
Если это все файлы по какой-то маске в определённой папке, возможно организация For c тем же вызовом процедуры - уточните задачу, если надо. Опять же, работая с текстом в CMD, можно хорошо вляпаться.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 14-09-2018 в 12:27.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:19, 14-09-2018 | #14


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Опять же, работая с текстом в CMD, можно хорошо вляпаться. »
Дык, почему бы не воспользоваться powershell?
Код: Выделить весь код
$arr = dir *.txt #либо прописываем массив с конкретными файлами, имеющими различные пути и расширения.
$arr|%{$a = gc $_.fullname;$a|select -skiplast 1|sc $_.fullname}

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:20, 14-09-2018 | #15


Пользователь


Сообщения: 102
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
Цитата megaloman:
Опять же, работая с текстом в CMD, можно хорошо вляпаться. »
Дык, почему бы не воспользоваться powershell?
Код: Выделить весь код
$arr = dir *.txt #либо прописываем массив с конкретными файлами, имеющими различные пути и расширения.
$arr|%{$a = gc $_.fullname;$a|select -skiplast 1|sc $_.fullname}
-------
scio me nihil scire »
увы, не везде и не всегда можно использовать что-то лучше cmd

Цитата megaloman:
Не тестировал.
Если это все файлы по какой-то маске в определённой папке, возможно организация For c тем же вызовом процедуры - уточните задачу, если надо. Опять же, работая с текстом в CMD, можно хорошо вляпаться. »
простите, что не конкретно описал

файлы имеют маску *.xml
находятся в одной папке, при удалении строки копируются в другую папку
содержимое разнообразное, но всегда нужно удалить последнюю строку (подпись) она тоже меняется

p.s. может и правда отдельную тему создать, что-бы людям проще было найти (я посчитал, что можно небольшой корректировкой кода обойтись, наивный?)

Последний раз редактировалось Anufriev, 15-09-2018 в 09:55.


Отправлено: 06:21, 15-09-2018 | #16


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Anufriev:
увы, не везде и не всегда можно использовать что-то лучше cmd »
увы, это так.
Но что мешает стремиться к лучшему?

-------
scio me nihil scire. Ѫ


Отправлено: 13:42, 15-09-2018 | #17


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Ориентироваться на строки в xml-файлах… Я бы не стал.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:10, 15-09-2018 | #18


Пользователь


Сообщения: 102
Благодарности: 1

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: txt DT00000000_000000_000000_0_0000_0000_000000000000.txt
(1.8 Kb, 6 просмотров)

Цитата megaloman:
Anufriev, дайте хотя бы один файл для примера, переименуйте его в txt и прикрепите к сообщению
Сильно сомневаюсь, что для xml »
Утро доброе, прошу

p.s. Естественно данный занулены

Последний раз редактировалось Anufriev, 17-09-2018 в 05:16.


Отправлено: 05:08, 17-09-2018 | #19


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Anufriev:
но всегда нужно удалить последнюю строку (подпись) она тоже меняется »
Скажите, коллега, подпись всегда одна и та же? А если могут быть разные — не попадётся ли как-нибудь однажды в подписи символ 0x0A или 0x0D, сиречь LineFeed, або CarriageReturn? Тройку нулевых символов я там уже вижу.

Цитата Anufriev:
увы, не везде и не всегда можно использовать что-то лучше cmd »
Ну, WSH везде есть.
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strSourceFolder

Dim objFSO
Dim objFile

Dim arrContent


If WScript.Arguments.Count = 1 Then
	strSourceFolder = WScript.Arguments.Item(0)
	
	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
	
	If objFSO.FolderExists(strSourceFolder) Then
		For Each objFile In objFSO.GetFolder(strSourceFolder).Files
			If StrComp(objFSO.GetExtensionName(objFile.Name), "xml", 0) = 0 Then
				With objFSO.OpenTextFile(objFile.Path)
					arrContent = Split(.ReadAll(), vbCrLf)
					.Close
				End With
				
				ReDim Preserve arrContent(UBound(arrContent) - 1)
				
				objFile.Copy objFSO.BuildPath(strSourceFolder, objFSO.GetBaseName(objFile.Name) & ".bak"), True
				
				With objFSO.CreateTextFile(objFile.Path, True)
					.Write Join(arrContent, vbCrLf) & vbCrLf
					.Close
				End With
			Else
				' Nothing to do
			End If
		Next
	Else
		WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
		WScript.Quit 2
	End If
	
	Set objFSO = Nothing
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
	WScript.Quit 1
End If

WScript.Quit 0
Путь к целевому каталогу указывается параметром скрипта (также можно просто перетащить папку на скрипт в Проводнике). Для каждого обработанного xml-файла создаётся резервная копия .bak.
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:50, 17-09-2018 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Как удалить последнюю строку в текстовом файле?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Удалить пустую строку в файле .txt denntl Скриптовые языки администрирования Windows 2 18-07-2013 11:48
Любой язык - [решено] Как выделить каждую определенною строку в текстовом файле KooDI Скриптовые языки администрирования Windows 6 05-03-2013 21:47
VBS/WSH/JS - [решено] Как изменить конкретную строку в текстовом файле с помощью Vbscript neo21 Скриптовые языки администрирования Windows 8 30-10-2011 15:47
CMD/BAT - [решено] Удалить в текстовом файле по условию AlexVong Скриптовые языки администрирования Windows 1 21-11-2010 11:53
[решено] Как удалить строки в текстовом файле при отсутсвии файла в опрелеленном месте? Pozia AutoIt 23 14-05-2009 21:41




 
Переход