В пакетном режиме, как мне создать пробелы в начале строки приглашения ввода?

Скажем, у меня есть пакетный файл с надписью "padding", и я хочу отложить начало строки приглашения для ввода пользователем. Если я использую пробелы, он не будет отображаться при запуске, он просто игнорирует пробелы. Это script для примера:

@echo off

echo.
echo.
echo    Hi.
echo    Please input something.
echo.
set /P input=   

После = есть три пробела, и я ожидаю, что маркер ввода находится далеко от края поля команды, однако эти пробелы игнорируются.

Как я могу исправить эту проблему? Я использую Windows 7 SP1.

Ответ 1

Как указано выше в комментариях, Vista и за пределами полосы пробелов в подсказке SET/P.

Способом решения проблемы является определение и использование символа обратного пробела в приглашении.

::define a variable containing a single backspace character
for /f %%A in ('"prompt $H &echo on &for %%B in (1) do rem"') do set BS=%%A

set /p var=%BS%   Leading spaces will not show properly.

Обычно приглашение будет в начале строки, поэтому выше все работает отлично.

Но если приглашение выдается из середины строки (очень необычно), тогда перед <BS> должен быть включен ведущий символ, так как backspace стирает все, что было до него.

<nul set/p=Leave the cursor at the end of this line:
set /p var=.%BS%   The dot (any char) is necessary to prevent the <BS> from erasing the :

Ответ 2

Вам нужно добавить точку после эха Следующий пример выведет "Test" с тремя ведущими пробелами:

echo.   Test

То же работает для табулятора. В следующем примере выведите "Test" с одной ведущей вкладкой:

echo.   Test

Ответ 3

Вдохновленный ответом dbenham, я предлагаю аналогичное, но более простое изменение, основанное на том, что символ backspace можно вставить в его необработанную форму (только в пакетных файлах, попытка этого в консоли напрямую не будет работать так, как ожидалось ):

set /p var=.'BS' Leading spaces will now show properly.

Символ "BS" можно вставить, набрав Alt + Numpad 008 (8 - обратный ASCII-код, не будет работать с использованием буквенно-цифровых клавиш, обычно найденных над буквами), используя текст хороший редактор (например, Notepad ++, Windows Notepad просто выполняет обратное действие).

Если не удается вставить символ , Notepad ++ имеет для этого полезную функцию: в меню TextFX выберите TextFX Tools, а затем вставьте Ascii Chart или Character: Insert Ascii Chart or character Нужный символ - это BS (белые буквы на черном фоне на снимке экрана), найденные в строке 9 (символ ASCII 8 - как указано выше - как таблица с нулевой индексацией).

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

  • Сделайте резервную копию script или выполните эксперимент в отдельном файле, поскольку символы без символов ASCII (акцентированные символы, не латинские и т.д.) в этом преобразовании потеряны.
  • В меню "Кодировка" выберите "Преобразовать в ANSI
  • Сохранить и снова проверить результат...

Протестировано с помощью Windows 7 Professional SP1.

Кредиты также переходят к:

Ответ 4

Это работает в каждой ОС Windows из W2K +, я пробовал, если вам это подходит. Вы можете просто использовать a: в строке.

set /p "var=Please input something: "
echo.%var%

Ответ 5

Ответ dbenhams работает хорошо, когда вы хотите отображать только текст, но не при создании файла, так как он вводит также обратные пространства.

Но для файлов (и для отображения) вы можете использовать copy /a для удаления CR/LF с помощью символа SUB (EOF).
Трюк заключается в том, чтобы добавить символ SUB непосредственно после текста, так что он непосредственно перед CR/LF вывода ECHO.
И затем с помощью переключателя /a команды копирования будет копироваться только содержимое символа SUB, поэтому удаляются SUB, а также CR/LF

@echo off
setlocal EnableDelayedExpansion
call :createSub
call :echoWithoutLinefeed "=hello"
call :echoWithoutLinefeed " world"
exit /b

:echoWithoutLinefeed
> txt.tmp (echo(%~1!sub!)
copy txt.tmp /a txt2.tmp /b > nul
type txt2.tmp
del txt.tmp txt2.tmp
exit /b

:createSub
copy nul sub.tmp /a > nul
for /F %%a in (sub.tmp) DO (
   set "sub=%%a"
)
del sub.tmp
exit /b