В пакете, как я могу создать пробелы в начале строки ввода ввода? - PullRequest
12 голосов
/ 26 марта 2012

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

@echo off

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

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

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

Ответы [ 5 ]

18 голосов
/ 11 декабря 2015

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

echo.   Test

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

echo.   Test
9 голосов
/ 26 марта 2012

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

Чтобы обойти проблему, нужно определить и использовать символ возврата в командной строке.

::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> должен быть включен начальный символ, так как клавиша возврата удалит все, что было до него.

<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 :
5 голосов
/ 28 мая 2013

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

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

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

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

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

  1. Создайте резервную копию сценария или выполните эксперимент в отдельном файле, так как символы, не входящие в ASCII (ударный символ, нелатинский и т. Д.), Равны lost в этом преобразовании.
  2. В меню Кодировка выберите Преобразовать в ANSI
  3. Сохраните и снова проверьте результат ...

Протестировано с Windows 7 Professional SP1.

Кредиты также отправляются по адресу:

1 голос
/ 28 мая 2013

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

set /p "var=Please input something: "
echo.%var%
0 голосов
/ 31 мая 2013

Ответ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...