3

мотивацияМожно ли повторить некоторые непечатаемые символы в пакетном/cmd?

У меня есть 3-й партии, как-то давно .bat файла, написанного для какой-то конкретной функции и потребует значительных усилий, чтобы перезаписать (что усилие также препятствует моей проблемы). В случае циклов самый простой способ его отладки, похоже, вторит некоторой информации на экран. Я использовал это с символом \r (0x0D) на других языках, который на некоторых терминалах/консоли перезаписывает одну и ту же строку (чтобы избежать перезарядки, поскольку в моем случае последняя строка будет содержать ошибку). Я уже сохраняю значение переменной. Однако, поскольку итерация может занять довольно много времени, я все равно буду рад написать какой-то вывод на экран, который не будет переполняться.

, что я попытался

  • Я знаю, что могу повторить один символ новой строки в cmd с echo. - однако мне нужно только возврат каретки
  • Я пробовал это, но они did't работа: echo \r, echo ^r, echo \x0d, echo ^x0d, echo #0d, echo ^#0d, echo #x0d, echo ^x0d
  • I'v е пытались duck the net для подобного материала без особой помощи

вопрос

Можно ли как-нибудь повторить возврат каретки (или другой непечатаемых) символов в Windows/DOS/NT/CMD пакетный файл?

пс. Я использую процессор XP или 7 cmd

+1

посмотреть здесь: http://stackoverflow.com/questions/7105433/windows-batch-echo-without-new-line – Stephan

+0

@Stephan спасибо, используя http://stackoverflow.com/a/13941131/ 611007 кажется возможным, хотя с пакетом [gnuwin32's coreutils] (http://gnuwin32.sourceforge.net/packages/coreutils.htm): 'echo blah | tr -d "\ n" ':) не слишком оптимальный, но, по крайней мере, он работает! – n611x007

ответ

8

Вам нужны два хака - один для определения символа возврата каретки, а другой - для эха строки текста без выдачи символа новой строки.

1) Определить возврат каретки.

:: Define CR to contain a carriage return (0x0D) 
for /f %%A in ('copy /Z "%~dpf0" nul') do set "CR=%%A" 

После того, как определено значение можно получить только с помощью замедленного расширения - как в !CR!, а не %CR%.

2) Печать текста на экране без выдачи новой строки

<nul set /p "=Your message here" 

Это будет ошибкой, если строка начинается с =.

Кроме того, ведущие котировки и/или пробелы могут быть удалены, в зависимости от версии Windows,

Собираем все вместе

@echo off 
setlocal enableDelayedExpansion 

:: Define CR to contain a carriage return (0x0D) 
for /f %%A in ('copy /Z "%~dpf0" nul') do set "CR=%%A" 

<nul set/p"=Part 1 - press a key!CR!" 
pause >nul 
<nul set/p"=Part 2 - press a key!CR!" 
pause >nul 
<nul set/p"=Part 3 - Finished !CR!" 

Обратите внимание, что я поставил !CR! в конце каждого сообщение в процессе подготовки к следующему. Вы не можете поставить !CR! в начале, потому что ведущее белое пространство будет удалено.

+0

ahhh - Я был так близко. Мое решение не сработало, потому что у меня был! Cr! в начале строки. Спасибо за объяснение. +1 – Stephan

+1

docs для взлома CR: он зависит от конкретного поведения '/ Z' [switch of copy] (http://technet.microsoft.com/en-us/library/bb490886.aspx). о '% ~ dfp0", см. [Использование параметров пакетного файла] (http://technet.microsoft.com/en-us/library/bb490890.aspx) – n611x007

1

Где-то вдоль линии «эхо» работает для печати строки [cr]. Отлично подходит для завершения вывода из какой-либо другой команды, которая не помещает [cr] в конец. Я использовал это для отправки CR в файлы, как в IPconfig | найти «Ответ» >> myip.txt, а затем echo \ >> myip.txt

+3

Нет, это выходы '' (перевозкаReturn и LineFeed), но OP ищет только «». – dbenham

+0

Упрощенный: вопрос не OP, но очень полезный (я искал это). –

1

Основываясь на сообщении dbenham, у меня есть следующие процедуры, которые работают в Win7 и в основном редактируются в Блокноте; Однако, я использовал Scite для создания забоя, ALT + , характер. Он немного отличается, сначала очищая строку, и помещая курсор в конец текста. Вот процедуры: пример

 
:RECHO 
<nul set/p"=backspace!CR!tabtabtabtabtabtabtabtabtabtab" 
<nul set/p"=backspace!CR!%*" 
GOTO :EOF 
 
:NECHO 
<nul set/p"=backspace!CR!tabtabtabtabtabtabtabtabtabtab" 
ECHO backspace!CR!%* 
GOTO :EOF 

dbenham в модификации:

@ECHO OFF 
SETLOCAL EnableDelayedExpansion 

FOR /F %%a IN ('copy /Z "%~dpf0" nul') DO SET "CR=%%a" 
SET "BS=" 

ECHO Testing CR. This line a regular echo ... 
CALL :RECHO Part 1 - press a key 
pause >nul 
CALL :RECHO Part 2 - press a key 
pause >nul 
CALL :NECHO Part 3 - Finished 
ECHO Testing CR. This line a regular echo ... 
GOTO END 

:RECHO 
<nul set/p"=!BS!!CR!            " 
<nul set/p"=!BS!!CR!%*" 
GOTO :EOF 

:NECHO 
<nul set/p"=!BS!!CR!            " 
ECHO !BS!!CR!%* 
GOTO :EOF 

:END 
ENDLOCAL 
EXIT /B 

При копировании этого скрипта, убедитесь, что сохраняется забой характер.

 
    SET "BS=backspace"