Эхо в той же строке - PullRequest
7 голосов
/ 04 ноября 2010

Я посмотрел предыдущие вопросы о вашей БД и не пытался ответить, но я пытаюсь.

Я хотел бы написать следующий код строки:

echo Executing backup....
backup procedure
echo Ok

но вывод должен быть:

Executing backup... Ok

Это возможно?!

Ответы [ 5 ]

9 голосов
/ 04 ноября 2010

Полагаю, вы используете dos / nt-batch.

Это возможно с помощью команды set / p, поскольку set / p не печатает CrLf

set /p "=Executing backup...." <nul
echo OK

Также возможно стереть строку с символом CR. Важно знать, что пробельные символы в начале набора / p игнорируются (в Vista, а не в XP), поэтому! Cr! должен быть размещен позже или в конце. CR может отображаться только с delayedExpansion, потому что% cr% работает, но символы CR удаляются в фазе процентного расширения (или непосредственно после этой фазы), но не в фазе отложенного расширения.

Пример счетчика, который использует только одну строку для отображения

@echo off
setlocal EnableDelayedExpansion EnableExtensions


call :CreateCR
for /l %%n in (1,1,10000) do (
    set /P "=Count %%n!CR!" <nul
)
echo(
goto :eof

:CreateCR
rem setlocal EnableDelayedExpansion EnableExtensions
set "X=."
for /L %%c in (1,1,13) DO set X=!X:~0,4094!!X:~0,4094!

echo !X!  > %temp%\cr.tmp
echo\>> %temp%\cr.tmp
for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do (
   endlocal
   set cr=%%a
   goto :eof
)
goto :eof

РЕДАКТИРОВАТЬ: Объяснение, как создается переменная cr (сделано с помощью трюка)

После установки переменной X в одну точку (сам символ не важен), она повторяется и становится 8188 символами в виде for /L %%c in (1,1,13) DO set X=!X:~0,4094!!X:~0,4094!

Затем переменная, два пробела и CR и LF выводятся в файл с echo !X! > %temp%\cr.tmp (обратите внимание на два пробела между !X! и >, и естественные окончания строк эхогенно изменяются внутри)

Теперь у нас есть 8192 символа, но буфер данных может содержать только 8191 символ, поэтому последний символ (перевод строки) будет удален!

В следующей строке echo\>> %temp%\cr.tmp другой файл CR/LF добавляется к файлу (\ в команде просто ничего не выводит, кроме возврата каретки и перевода строки, как echo по собственной воле вывод ECHO is ON/OFF), это важно, так как одиночный CR не может быть прочитан в конце строки (Подробнее позже).

Итак, файл теперь содержит <8188 .'s><SPACE><SPACE><CR><CR><LF>

for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do читает второй токен, разделителями являются стандартный пробел и табуляция, поэтому второй токен представляет собой только один CR, так как следующий CR/LF удаляется как конец стандартной строки.

Наконец, endlocal используется для возврата в среду без существующих временных переменных X, c и a (как и в скобках endlocal, он позволяет установить cr перед endlocal фактически вступает в силу в конце скобок (также может быть записано как for /f "tokens=2 usebackq" %%a in ("%temp%\cr.tmp") do endlocal&set cr=%%a&goto :eof)

Дополнительно

Это был мой первый способ создания символа CR, но для этого нужно время и временный файл.
Позже я увидел более простой метод получения CR из команды copy /z.

for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
3 голосов
/ 04 ноября 2010

Попробуйте это в системе Posix (Linux)

echo -n "Executing backup.... "
echo -n "backup procedure "
echo "Ok"

В Windows это намного сложнее.Вам нужно будет использовать что-то вроде этого:

@echo off
echo|set /p ="Executing backup...."
echo|set /p =" backup procedure"

Проверьте этот пост: http://www.pcreview.co.uk/forums/showpost.php?s=1a20b16775d915998b30bd76a0ec5d35&p=4432915&postcount=7.

1 голос
/ 04 ноября 2010

Это что-то вроде хака, но вот статья , описывающая, как это сделать для Windows.

Из этой статьи конечный результат (отредактированный для вашей настройки) выглядит такэто:

SET /P var=Backing up
%Result%....<NUL

Backup_process %Result% >NUL 2>&1

IF ERRORLEVEL 1 
  ECHO FAIL 
ELSE
  ECHO OK
0 голосов
/ 27 марта 2014

at Что делает косая черта перед каналом в cmd для удаления окончания строки эха? лучшее предложение:

выводить текст без перевода строки очень неэффективно, так как канал создает два новых экземпляра cmd.exe. Гораздо проще и быстрее использовать

     <nul set /p "=My Text"

Перенаправление из NUL также остановит ожидание пользовательского ввода.

0 голосов
/ 04 ноября 2010

Я сделал нечто подобное, используя VBScript.

Поместите этот код в EchoNoNewline.vbs :

If WScript.Arguments.Named.Exists("TEXT") Then
  WScript.StdOut.Write WScript.Arguments.Named.Item("TEXT")
End If

Из вашего пакетного файла используйте скрипткак это:

CSCRIPT EchoNoNewLine.vbs //NOLOGO /TEXT:"Executing backup...."
backup procedure
CSCRIPT EchoNoNewLine.vbs //NOLOGO /TEXT:"Ok"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...