批处理中,如何在输入提示字符串的开头创建空格?

问题描述 投票:0回答:7

假设我有一个批处理文件,其中包含“填充”,并且我想缩进提示字符串的开头以供用户输入。如果我使用空格,则运行时不会显示它,它只是忽略空间。此脚本为例:

@echo off

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

=
后面有三个空格,我期望输入的标记远离命令框的边缘,但这些空格被忽略。

如何解决这个问题?我使用的是 Windows 7 SP1。

batch-file cmd
7个回答
35
投票

echo后面需要加一个点 以下示例将输出带有三个前导空格的“Test”:

echo.   Test

制表器也同样适用。以下示例将输出带有一个前导选项卡的“Test”:

echo.   Test

10
投票

正如上面的评论所述,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>
之前包含一个前导字符,因为退格键会删除它之前的所有内容。

<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 :

6
投票

深受 dbenham 答案的启发,我提出了一个类似但更简单的变体,基于这样的事实,退格字符可以以其原始形式插入(仅在批处理文件中,直接在控制台中尝试此操作将无法按预期工作):

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

可以通过使用 good 文本编辑器(例如 Notepad++)输入 Alt + Numpad 008(8 是退格键的 ASCII 代码,无法使用通常在字母上方找到的字母数字键)来插入“BS”字符,Windows 记事本仅执行退格操作)。

如果无法插入字符,Notepad++ 有一个有用的功能:在 TextFX 菜单中,选择 TextFX 工具,然后选择插入 Ascii 图表或字符Insert Ascii Chart or character 所需的字符是第 9 行中找到的

BS
(屏幕截图中黑色背景上的白色字母)(ASCII 字符
8
- 如上所述 - 因为它是零索引表)。

如果仍然结果与所描述的不是,请尝试将文件编码更改为ASCII。使用记事本++:

  1. 制作脚本的备份副本或在单独的文件中执行实验,因为非 ASCII 字符(重音字符、非拉丁字符等)在此转换中会丢失
  2. 编码菜单中,选择转换为ANSI
  3. 保存并再次检查结果...

使用 Windows 7 Professional SP1 进行测试。

学分还前往:


1
投票

如果它适合您,这适用于 W2K + 我尝试过的每个 Windows 操作系统。 您可以在字符串中使用 : 。

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

0
投票
当您只想显示文本时,

dbenhams 答案效果很好,但如果您创建文件,则效果不佳,因为它还输入退格键。

但是对于文件(以及显示),您可以使用

copy /a
在 SUB(EOF) 字符的帮助下删除 CR/LF。
诀窍是直接在文本后面附加
SUB
字符,因此它就位于 ECHO 输出的
CR/LF
之前。
然后使用复制命令的
/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

0
投票

您可以使用双引号(“...”)来达到您的目的

set /p OPTION="Your choice:   "

As you can see here, the cursor for input is 3 units away.


0
投票

我是这样做的:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
for /F %%a in ('ECHO prompt $E ^| cmd') do (
    SET "ESC=%%a"
)
SET /p input=!ESC![0m   Give me some space  
ECHO Your input was "%input%"
ECHO.
ECHO To prevent trailing spaces beeing removed (e. g. by a formatter) you can also do something like:
SET /p input=!ESC![0m   Give me some space  !ESC![0m
ECHO This should be enough. But there is some more:
ECHO.
SET /p=!ESC![44m    Give me more space and color
SET /p="!ESC![0;95m        !ESC![4mGive me more space, color and spe(ia| (haracters and trailling space     "
SET /p="!ESC![0;104m          Give me more space, color and spe(ia| (haracters but please !ESC![0mstop the colors"

最后两种情况由于一些特殊字符需要双引号。它们也可以用扬抑符来转义(例如

^|
),但如果你有很多它们,它会变得混乱。给定的解决方案不能(很好地)使用引号。

这个解决方案很大程度上依赖于这个(很棒的)答案:https://stackoverflow.com/a/38617204/16104038

© www.soinside.com 2019 - 2024. All rights reserved.