相当于"echo -n"的Windows不再适用于Win7

pax*_*blo 5 windows cmd

我在Windows cmd.exe(至少高达XP)中有一个漂亮的技巧来模拟没有换行符的UNIX回声的行为echo -n.例如,命令:

<nul: set /p junk= xyzzy
Run Code Online (Sandbox Code Playgroud)

将导致正好六个字符输出,前导空格和字符串"xyzzy",没有别的.

如果你有兴趣,为什么这个作品,它实际上是一个输入命令,它输出" xyzzy"作为提示,然后分配该输入前等待用户输入junk环境变量.在这种特殊情况下,它不会等待用户输入,因为它会从nul设备中获取输入.

它在cmd脚本中非常有用(例如)在循环中处理文件(每个文件一次迭代),您希望每行列出多个文件.通过使用这个技巧,您可以简单地输出每个文件名后跟一个空格而不是换行符,然后在循环之后输出换行符来完成:

Processing files:
    file1.txt file42.txt p0rn.zip
Run Code Online (Sandbox Code Playgroud)

现在我发现,在Windows 7下,空格不再输出,所以我得到的是:

Processing files:
file1.txtfile42.txtp0rn.zip
Run Code Online (Sandbox Code Playgroud)

有没有办法让set /p我再次开始尊重我的空间,或者在Win7中有另一种方法可以达到同样的效果吗?

我试过引用,使用.(可以工作echo)甚至转义字符串^,但它们似乎都不起作用:

C:\Pax> <nul: set /p junk= xyzzy
xyzzy

C:\Pax> <nul: set /p junk=" xyzzy"
xyzzy

C:\Pax> <nul: set /p junk=' xyzzy'
' xyzzy'

C:\Pax> <nul: set /p junk=. xyzzy
. xyzzy

C:\Pax> <nul: set /p junk=^ xyzzy
xyzzy
Run Code Online (Sandbox Code Playgroud)

我需要的是:

C:\Pax> some_magical_command_with_an_argument xyzzy
 xyzzy
Run Code Online (Sandbox Code Playgroud)

这将让我在开始的空间(S)结尾没有换行符.

pax*_*blo 0

这不是使用set或其他cmd内部的东西,但您可以使用cscript(也包含在标准 Windows 安装中)来执行类似的操作。cmd您甚至可以通过创建临时文件从文件本身控制它(无需维护单独的文件) vbs

将此代码放入您的cmd文件中:

rem Create the VBS file to output spaces and a word.

echo.for i = 1 to WScript.Arguments.Item(0) >spacetext.vbs
echo.     WScript.StdOut.Write ^" ^" >>spacetext.vbs
echo.next >>spacetext.vbs
echo.WScript.StdOut.Write WScript.Arguments.Item(1) >>spacetext.vbs

rem Do this once per word you want output (eg, in a loop).

cscript /nologo spacetext.vbs 0 Hello,
cscript /nologo spacetext.vbs 1 my
cscript /nologo spacetext.vbs 1 name
cscript /nologo spacetext.vbs 1 is
cscript /nologo spacetext.vbs 4 Pax.

rem Do this at the end to add newline and kill temp file.

echo.
del spacetext.vbs
Run Code Online (Sandbox Code Playgroud)

其输出正是您所期望的:

Hello, my name is    Pax.
Run Code Online (Sandbox Code Playgroud)