Batch file 在批处理中,如何在输入提示字符串的开头创建空格?
假设我有一个包含“padding”的批处理文件,我想缩进提示字符串的开头,以便用户输入。如果我使用空格,它在运行时不会显示,它只会忽略空格。以下脚本是一个示例: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提示符中状
@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给出的正确且被接受的答案获得更多的选票?