Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] echo без пустой строки (http://forum.oszone.net/showthread.php?t=338880)

letti 24-01-2019 06:52 2854199

echo без пустой строки
 
Добрый день!

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

YuS_2 24-01-2019 10:37 2854222

Цитата:

Цитата letti
Есть ли возможность удалить ту самую последнюю (пустую) строку ? »

Та самая строка формируется конечным символом перевода строки командой echo
Не знаю, зачем понадобилось убирать эту строку, т.к. при добавлении текста в этот файл командой >> (после удаления пустой строки, то бишь символа перевода строки), этот текст "склеится" с последней строкой... но, в принципе так:
Код:

<nul set /p  =текст>>out.txt

Iska 24-01-2019 17:16 2854316

Цитата:

Цитата letti
Есть ли возможность удалить ту самую последнюю (пустую) строку ? »

Удалить — нет. Не добавлять символы перевода строки и возврата каретки (0x0D, 0x0A) — да.

Токмо лучше наоборот — на всякий случай:
Код:

>>"out.txt" <nul set /p sVar=текст

alpap 24-01-2019 18:17 2854330

Цитата:

Цитата Iska
на всякий случай: »

если от такого: (<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 2854341

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

YuS_2 24-01-2019 19:41 2854357

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

Ну а если, вдруг, понадобится, что-то уж слишком снабженное разными хитрыми знаками, то можно и такой вот зубодробительный код соорудить:
почти однострок:
Код:

@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 2854361

Цитата:

Цитата Iska
Удалить — нет. Не добавлять символы перевода строки и возврата каретки (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 2854366

megaloman,
собственно изменять(ить) можно только последнюю строку вывода (вернее записи)
Код:

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


megaloman 24-01-2019 22:55 2854406

alpap,
Цитата:

Цитата alpap
изменять(ить) можно только последнюю строку вывода »

Фишка моего предложения
Цитата:

Цитата megaloman
заранее узнать,какая строка последняя часто очень проблематично, зато узнать, первая ли это строка в файле - нет проблем. »

Проще обработать особым образом первую строку, зато последующие можно не думая выдавать единообразным образом ни о чем не думая.
То есть в первой строке записываем текст без Cr Lf на конце, а последующие строки пишем как Cr+Lf+Текст

alpap 25-01-2019 03:27 2854464

Цитата:

Цитата megaloman
Фишка моего предложения »

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

@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 2854474

Цитата:

Цитата megaloman
заранее узнать, какая строка последняя часто очень проблематично, зато узнать, первая ли это строка в файле »

Не совсем так...
Код:

@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 2854510

Цитата:

Цитата letti
Есть ли возможность удалить ту самую последнюю (пустую) строку ? »

Цитата:

Цитата Iska
Удалить — нет. »

Если нельзя, но очень хочется, то можно (через перезапись исходного файла)
Код:

@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



Время: 17:39.

Время: 17:39.
© OSzone.net 2001-