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

时间:2012-03-25 22:20:43

标签: batch-file cmd

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

@echo off

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

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

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

5 个答案:

答案 0 :(得分:17)

您需要在回声后添加一个点 以下示例将输出带有三个前导空格的“Test”:

echo.   Test

同样适用于制表工具。以下示例将使用一个前导选项卡输出“Test”:

echo.   Test

答案 1 :(得分:9)

正如上面的评论所述,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 :

答案 2 :(得分:5)

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

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

可以通过输入Alt + Numpad 008插入'BS'字符(8是退格的ASCII代码,使用通常位于字母上方的字母数字键无效),使用良好文本编辑器(例如Notepad++,Windows Notepad只执行退格操作)。

如果无法插入 字符,Notepad ++会为此提供一个有用的功能:在 TextFX 菜单中,选择 TextFX工具< / em>后跟插入Ascii图表或字符Insert Ascii Chart or character 所需的字符是第9行中找到的BS(屏幕截图中黑色背景上的白色字母)(ASCII字符8 - 如上所述 - 因为它是零索引表。)

如果,结果,请尝试将文件编码更改为ASCII。使用Notepad ++:

  1. 制作脚本的备份副本或在单独的文件中执行实验,因为此转换中非ASCII字符(重音符号,非拉丁语等)丢失
  2. 编码菜单中,选择转换为ANSI
  3. 再次保存并检查结果......
  4. 使用Windows 7 Professional SP1进行测试。

    积分也转到:

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

当您只想显示文本时,dbenhams回答很有效,但如果您创建文件则不然,因为它还输入了退格。

但是对于文件(以及用于显示),您可以使用copy /a在SUB(EOF)字符的帮助下删除CR / LF。
诀窍是在文本后直接附加SUB字符,因此它就在ECHO输出的CR/LF之前。
然后使用复制命令的/a开关仅将内容复制到SUB字符,以便删除SUBCR/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