在Windows批处理中,Linux shell命令echo -n抑制输出末尾的换行符是什么?

其思想是在循环中的同一行上写入。


当前回答

使用:echo | set /p=或<NUL set /p=都可以抑制换行符。

然而,当编写更高级的脚本时,检查ERRORLEVEL变得很重要,因为设置set /p=而不指定变量名将把ERRORLEVEL设置为1,这可能是非常危险的。

一个更好的方法是使用一个虚拟变量名,就像这样: echo | set /p dummyName=Hello World

这将产生你想要的东西,没有任何偷偷摸摸的东西在后台,因为我必须找到艰难的方法,但这只适用于管道版本;<NUL set /p dummyName=Hello仍然会将ERRORLEVEL提升为1。

其他回答

回显带有空格且没有换行符

如Pedro之前所述,没有新行和前面有空格的echo有效(假设“9”是一个真正的[BackSpace])。

<nul set /p=.9    Hello everyone

我在Windows 10的新主机上遇到了一些问题,但我还是通过以下方式解决了问题。 在CMD中输入:

echo .◘>bs.txt

我按[Alt] +[8]键实现了“▲” (实际符号可能因代码页而异)。

然后使用Notepad.exe将结果从“bs.txt”复制到需要的地方就很容易了。

@echo off
<nul set /p "_s=.◘    Hello everyone"
echo: here

DIY cw.exe(控制台编写)实用程序

如果你找不到现成的,你可以自己动手做。有了这个cw实用程序,你可以使用每一种字符。至少,我是这么想的。请对它进行压力测试,然后告诉我。

工具

你所需要的只是安装。net,这在当今非常普遍。

材料

输入/复制粘贴了一些字符。

步骤

用以下内容创建.bat文件。

/* >nul 2>&1

@echo off
setlocal

set exe=cw
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*csc.exe"') do set "csc=%%v"

"%csc%" -nologo -out:"%exe%.exe" "%~f0"

endlocal
exit /b %errorlevel%

*/

using System;

namespace cw {
    class Program {
        static void Main() {
            var exe = Environment.GetCommandLineArgs()[0];
            var rawCmd = Environment.CommandLine;
            var line = rawCmd.Remove(rawCmd.IndexOf(exe),exe.Length).TrimStart('"');
            line = line.Length < 2 ? "\r" : line.Substring(2) ;
            Console.Write(line);
        }
    }
}

运行它。 现在您有了一个很棒的4KB实用程序,可以删除.bat。

或者,您可以在任何批处理中插入此代码作为子例程,将生成的.exe发送到%temp%,在批处理中使用它,并在完成时删除它。

如何使用

如果你想写一些没有换行的东西: 任何你想要的,即使是"",但记住转义^|,^^,^&等,除非双引号,如"| ^& "。

如果你想要一个回车(回到行首),运行just 连续波

所以试试从命令行:

for /l %a in (1,1,1000) do @(cw ^|&cw&cw /&cw&cw -&cw&cw \&cw)

你可以从gnuwin32 (coreutils包)中使用“tr”删除换行符

@echo off
set L=First line
echo %L% | tr -d "\r\n"
echo Second line
pause

顺便说一下,如果您正在编写大量脚本,gnuwin32是一个金矿。

使用:echo | set /p=或<NUL set /p=都可以抑制换行符。

然而,当编写更高级的脚本时,检查ERRORLEVEL变得很重要,因为设置set /p=而不指定变量名将把ERRORLEVEL设置为1,这可能是非常危险的。

一个更好的方法是使用一个虚拟变量名,就像这样: echo | set /p dummyName=Hello World

这将产生你想要的东西,没有任何偷偷摸摸的东西在后台,因为我必须找到艰难的方法,但这只适用于管道版本;<NUL set /p dummyName=Hello仍然会将ERRORLEVEL提升为1。

简单的SET /P方法在不同的Windows版本之间有一些限制。

前导引号可能被删除 前导空白可能被剥离 Leading =导致语法错误。

更多信息请参见http://www.dostips.com/forum/viewtopic.php?f=3&t=4209。

jeb发布了一个聪明的解决方案,解决了输出文本没有换行的大部分问题,甚至有前导空格或=我已经改进了方法,以便它可以安全地打印任何有效的批处理字符串,没有新行,在任何版本的Windows XP开始。注意:writeInitialize方法包含一个字符串字面值,可能不能很好地发布到站点。包括一个注释,描述字符序列应该是什么。

:write和:writeVar方法经过优化,只有包含麻烦的前导字符的字符串才会使用我修改过的jeb的COPY方法来编写。不麻烦的字符串是使用更简单和更快的SET /P方法编写的。

@echo off
setlocal disableDelayedExpansion
call :writeInitialize
call :write "=hello"
call :write " world!%$write.sub%OK!"
echo(
setlocal enableDelayedExpansion
set lf=^


set "str= hello!lf!world^!!!$write.sub!hello!lf!world"
echo(
echo str=!str!
echo(
call :write "str="
call :writeVar str
echo(
exit /b

:write  Str
::
:: Write the literal string Str to stdout without a terminating
:: carriage return or line feed. Enclosing quotes are stripped.
::
:: This routine works by calling :writeVar
::
setlocal disableDelayedExpansion
set "str=%~1"
call :writeVar str
exit /b


:writeVar  StrVar
::
:: Writes the value of variable StrVar to stdout without a terminating
:: carriage return or line feed.
::
:: The routine relies on variables defined by :writeInitialize. If the
:: variables are not yet defined, then it calls :writeInitialize to
:: temporarily define them. Performance can be improved by explicitly
:: calling :writeInitialize once before the first call to :writeVar
::
if not defined %~1 exit /b
setlocal enableDelayedExpansion
if not defined $write.sub call :writeInitialize
set $write.special=1
if "!%~1:~0,1!" equ "^!" set "$write.special="
for /f delims^=^ eol^= %%A in ("!%~1:~0,1!") do (
  if "%%A" neq "=" if "!$write.problemChars:%%A=!" equ "!$write.problemChars!" set "$write.special="
)
if not defined $write.special (
  <nul set /p "=!%~1!"
  exit /b
)
>"%$write.temp%_1.txt" (echo !str!!$write.sub!)
copy "%$write.temp%_1.txt" /a "%$write.temp%_2.txt" /b >nul
type "%$write.temp%_2.txt"
del "%$write.temp%_1.txt" "%$write.temp%_2.txt"
set "str2=!str:*%$write.sub%=%$write.sub%!"
if "!str2!" neq "!str!" <nul set /p "=!str2!"
exit /b


:writeInitialize
::
:: Defines 3 variables needed by the :write and :writeVar routines
::
::   $write.temp - specifies a base path for temporary files
::
::   $write.sub  - contains the SUB character, also known as <CTRL-Z> or 0x1A
::
::   $write.problemChars - list of characters that cause problems for SET /P
::      <carriageReturn> <formFeed> <space> <tab> <0xFF> <equal> <quote>
::      Note that <lineFeed> and <equal> also causes problems, but are handled elsewhere
::
set "$write.temp=%temp%\writeTemp%random%"
copy nul "%$write.temp%.txt" /a >nul
for /f "usebackq" %%A in ("%$write.temp%.txt") do set "$write.sub=%%A"
del "%$write.temp%.txt"
for /f %%A in ('copy /z "%~f0" nul') do for /f %%B in ('cls') do (
  set "$write.problemChars=%%A%%B    ""
  REM the characters after %%B above should be <space> <tab> <0xFF>
)
exit /b