假设我有一个批处理文件,其中包含“填充”,并且我想缩进提示字符串的开头以供用户输入。如果我使用空格,则运行时不会显示它,它只是忽略空间。此脚本为例:
@echo off
echo.
echo.
echo Hi.
echo Please input something.
echo.
set /P input=
=
后面有三个空格,我期望输入的标记远离命令框的边缘,但这些空格被忽略。
如何解决这个问题?我使用的是 Windows 7 SP1。
echo后面需要加一个点 以下示例将输出带有三个前导空格的“Test”:
echo. Test
制表器也同样适用。以下示例将输出带有一个前导选项卡的“Test”:
echo. Test
正如上面的评论所述,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 :
深受 dbenham 答案的启发,我提出了一个类似但更简单的变体,基于这样的事实,退格字符可以以其原始形式插入(仅在批处理文件中,直接在控制台中尝试此操作将无法按预期工作):
set /p var=.'BS' Leading spaces will now show properly.
可以通过使用 good 文本编辑器(例如 Notepad++)输入 Alt + Numpad 008(8 是退格键的 ASCII 代码,无法使用通常在字母上方找到的字母数字键)来插入“BS”字符,Windows 记事本仅执行退格操作)。
如果无法插入字符,Notepad++ 有一个有用的功能:在 TextFX 菜单中,选择 TextFX 工具,然后选择插入 Ascii 图表或字符: 所需的字符是第 9 行中找到的
BS
(屏幕截图中黑色背景上的白色字母)(ASCII 字符 8
- 如上所述 - 因为它是零索引表)。
如果仍然结果与所描述的不是,请尝试将文件编码更改为ASCII。使用记事本++:
使用 Windows 7 Professional SP1 进行测试。
学分还前往:
如果它适合您,这适用于 W2K + 我尝试过的每个 Windows 操作系统。 您可以在字符串中使用 : 。
set /p "var=Please input something: "
echo.%var%
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
我是这样做的:
@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