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

Batch file 在批处理中,如何在输入提示字符串的开头创建空格?,batch-file,cmd,Batch File,Cmd,假设我有一个包含“padding”的批处理文件,我想缩进提示字符串的开头,以便用户输入。如果我使用空格,它在运行时不会显示,它只会忽略空格。以下脚本是一个示例: @echo off echo. echo. echo Hi. echo Please input something. echo. set /P input= 在=之后有三个空格,我希望输入的标记远离命令框的边缘,但是这些空格被忽略 我如何解决这个问题?我正在使用Windows 7 SP1。作为SET/p提示符中状

假设我有一个包含“padding”的批处理文件,我想缩进提示字符串的开头,以便用户输入。如果我使用空格,它在运行时不会显示,它只会忽略空格。以下脚本是一个示例:

@echo off

echo.
echo.
echo    Hi.
echo    Please input something.
echo.
set /P input=   
=
之后有三个空格,我希望输入的标记远离命令框的边缘,但是这些空格被忽略


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

作为SET/p提示符中状态、Vista和beyond条带前导空格上方的注释

解决此问题的方法是在提示符中定义并使用退格字符

::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.
通常情况下,提示将出现在一行的开头,因此上面的操作很好

但是,如果提示是从一行中间发出的(非常不寻常),则应在
之前包含一个前导字符,因为退格将删除它之前的任何内容

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

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

set/p var=.“BS”前导空格现在将正确显示。

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

如果无法插入字符,记事本++有一个有用的功能:在TextFX菜单中,选择TextFX工具,然后选择插入Ascii图表或字符: 所需字符是第9行中的
BS
(屏幕截图上黑色背景上的白色字母)(ASCII字符
8
-如上所述-因为它是一个零索引表)

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

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

    学分还包括:

    • @大卫卡拉南对获得的结果提出质疑
    • Wadelau for(截图是从中提取的)

    如果适合您的话,这在我尝试过的W2K+的所有Windows操作系统中都有效。 你可以在字符串中使用:

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

    当您只想显示文本时,dbenhams answer工作得很好,但如果您创建了一个文件,则不会,因为它还输入了退格

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

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

    echo.   Test
    
    制表器也是如此。以下示例将输出带有一个前导选项卡的“Test”:

    echo.   Test
    

    你试过(set/p input=)吗?它在WindowsXPSP3中对我有效(目前还不能说适用于任何其他版本)。我的意思是,当执行停止读取我的输入时,光标距离命令窗口的边缘有三个空格。是的,我相信它可能在Vista+@Andiry M上被破坏-我使用的是Windows 7,这可能就是原因。不过,如果能找到解决方案还是不错的。我尝试了这个方法,但在运行文件后我看到了这个:
    。前导空格现在将正确显示。
    @davidcalanan:请注意,
    'BS'
    是一个单独的字符,我知道,我得到了一个特殊的退格字符来显示,但是,当我运行代码时,结果是
    。前导空格现在将显示
    ,而不是“前导空格现在将显示”`@davidcalanan-请查看最近添加到答案中的“文件编码”提示。如果这不起作用,请共享您的代码页-通过运行
    cmd.exe
    并键入
    mode
    来获取代码页。Nit:与插入Ascii图表或字符功能相比,在记事本++中,只需进入“编辑”菜单并选择“字符面板”,即可获得Ascii插入面板。然后简单地选择所需的条目(
    7
    /
    BEL
    ,在本例中)并双击以在光标位置插入。是的,批处理是一大堆BS。在Windows 10中,它像一个符咒一样工作。这并不能回答问题,而是使用
    set/p
    添加没有换行符的空格。它如何能比dbenham给出的正确且被接受的答案获得更多的选票?