Войти

Показать полную графическую версию : [решено] echo без пустой строки


letti
24-01-2019, 06:52
Добрый день!

при попытке передать информацию в файл (echo text >> file.txt) подставляется пустая последняя строка. Есть ли возможность удалить ту самую последнюю (пустую) строку ?

YuS_2
24-01-2019, 10:37
Есть ли возможность удалить ту самую последнюю (пустую) строку ? »
Та самая строка формируется конечным символом перевода строки командой echo
Не знаю, зачем понадобилось убирать эту строку, т.к. при добавлении текста в этот файл командой >> (после удаления пустой строки, то бишь символа перевода строки), этот текст "склеится" с последней строкой... но, в принципе так:
<nul set /p =текст>>out.txt

Iska
24-01-2019, 17:16
Есть ли возможность удалить ту самую последнюю (пустую) строку ? »
Удалить — нет. Не добавлять символы перевода строки и возврата каретки (0x0D, 0x0A) — да.

Токмо лучше наоборот — на всякий случай:
>>"out.txt" <nul set /p sVar=текст

alpap
24-01-2019, 18:17
на всякий случай: »
если от такого: (<nul set /p=TEXT 1>>out.txt), да, (>>out.txt <nul set /p=TEXT 1) спасет
если от такого: (<nul set /p=TEXT |>>out.txt), хоть где не пиши запись в файл, спасет только:

>>out.txt <nul set /p="TEXT |"

Iska
24-01-2019, 18:51
alpap, от первого. Особенно неприятно, когда номером потока оказывается часть содержимого переменной окружения или переменной цикла разбора: зараз и не обратишь внимания, что куда пропало.

YuS_2
24-01-2019, 19:41
Да, естественно, всё верно. Если требуется соломки подстелить, то лучше сначала продумать, какие возможные символы на вход могут подаваться, а потом уже код составлять в соответствии с этим думками :)

Ну а если, вдруг, понадобится, что-то уж слишком снабженное разными хитрыми знаками, то можно и такой вот зубодробительный код соорудить:
почти однострок:
@echo off&set "x=|"&set var=^^!*"'||&*)"%%=^|", ;<>
cmd/v/c echo.^&set x=!x:^^^^=^^^^^^^^!^&for /f usebackq^^ tokens^^=1-4^^ delims^^=^^^%x%^^ eol^^= %%i in ('!var:^^^%x%^^=?^^^%x%!') do @set i=%%i^&set j=%%j^&set k=%%k^&echo. [!i:~^^,-1!] ^&echo. [!j:~^^,-1!]^&echo. [!k:~^^,-1!] ^&echo. [%%l]^&echo.^&echo.!i:~^^,-1!!x!!j:~^^,-1!!x!!k:~^^,-1!!x!%%l^&echo.^&exit /b
и пользоваться даже злобными спецсимволами... :)

megaloman
24-01-2019, 20:08
Удалить — нет. Не добавлять символы перевода строки и возврата каретки (0x0D, 0x0A) — да. »
При этом при выводе заранее узнать, какая строка последняя часто очень проблематично, зато узнать, первая ли это строка в файле (по отсутствию этого самого файла или при пересоздании этого файла при выводе первой строки) - нет проблем. Поэтому, чтобы текст не "склеивался":
>"out.txt" (<nul set /p sVar=текст1)
>>"out.txt" (Echo.&<nul set /p sVar=текст2)
>>"out.txt" (Echo.&<nul set /p sVar=текст3)
и так далее

alpap
24-01-2019, 20:45
megaloman,
собственно изменять(ить) можно только последнюю строку вывода (вернее записи)

@echo off
>>"out.txt" (
echo текст1
echo текст2
echo:& <nul set /p="текст3"
)
pause

megaloman
24-01-2019, 22:55
alpap, изменять(ить) можно только последнюю строку вывода »Фишка моего предложениязаранее узнать,какая строка последняя часто очень проблематично, зато узнать, первая ли это строка в файле - нет проблем. »Проще обработать особым образом первую строку, зато последующие можно не думая выдавать единообразным образом ни о чем не думая.
То есть в первой строке записываем текст без Cr Lf на конце, а последующие строки пишем как Cr+Lf+Текст

alpap
25-01-2019, 03:27
Фишка моего предложения »
фишку понял и предложу вариант с почти одинаковым написанием строк, разница лишь в нумерации, несложно добавить в поток, а может изначально будет или будет не лишней для кого-то по задаче:

@echo off
set "$_1=текст1"
set "$_2=текст2"
set "$_3=текст3"

>"out.txt" (for /f "tokens=2* delims=_=" %%a in ('set $_') do @(
if %%a==1 (
<nul set /p="%%b"
) else (
echo:& <nul set /p="%%b"
)
)
)
pause

YuS_2
25-01-2019, 08:38
заранее узнать, какая строка последняя часто очень проблематично, зато узнать, первая ли это строка в файле »
Не совсем так...
@echo off
set "file_in=test.txt"
set "file_out=out.txt"

for /f "tokens=1 delims=:" %%a in ('findstr /inrc:".*" "%file_in%"') do set /a end=%%~a
for /f "tokens=1,* delims=:" %%a in ('findstr /inrc:".*" "%file_in%"') do (
if %%~a neq %end% (>>"%file_out%" echo.%%~b) else (<nul >>"%file_out%" set /p "=%%~b")
)
pause

megaloman
25-01-2019, 12:33
Есть ли возможность удалить ту самую последнюю (пустую) строку ? »Удалить — нет. »Если нельзя, но очень хочется, то можно (через перезапись исходного файла)@Echo Off
Set "File=Z:\Box_In\CrLf_file.txt"

Del "%File%.tmp" 2>nul
FOR /F "usebackq delims=" %%s IN (`2^>nul more "%File%"`) DO (
If Exist "%File%.tmp" (>>"%File%.tmp" (Echo.&<nul set /p @s=%%s)) Else (>"%File%.tmp" (<nul set /p @s=%%s))
)
Move /Y "%File%.tmp" "%File%" >nul




© OSzone.net 2001-2012