假设我有一个批处理文件,其中包含“填充”,我想缩进提示字符串的开头以供用户输入。如果我使用空格,它将在运行时显示,它只是忽略了空间。这个脚本的例子如下:
@echo off
echo.
echo.
echo Hi.
echo Please input something.
echo.
set /P input=
=
之后有三个空格,我期望输入的标记远离命令框的边缘,但忽略这些空格。
如何解决此问题?我使用的是Windows 7 SP1。
答案 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图表或字符:
所需的字符是第9行中找到的BS
(屏幕截图中黑色背景上的白色字母)(ASCII字符8
- 如上所述 - 因为它是零索引表。)
如果仍,结果不,请尝试将文件编码更改为ASCII。使用Notepad ++:
使用Windows 7 Professional SP1进行测试。
积分也转到:
答案 3 :(得分:1)
这适用于W2K的每个Windows操作系统+我试过,如果它适合你。 你可以在字符串中使用:
set /p "var=Please input something: "
echo.%var%
答案 4 :(得分:0)
但是对于文件(以及用于显示),您可以使用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