微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我在Windows cmd.exe (至less是XP)中有一个很好的技巧来模拟UNIX echo的行为,而不用换行符echo -n 。 例如,命令:

<nul: set /p junk= xyzzy

会导致正好输出六个字符,前导空格和string“xyzzy”,而不是别的。

如果你对这个原因感兴趣,它实际上是一个input命令,在提示输出到junk环境variables之前,输出" xyzzy"作为提示,然后等待用户input。 在这种特殊情况下,它不会等待用户input,因为它抓取了来自nul设备的input。

当(例如)在循环中处理文件(每个文件一次迭代),并且每行列出多个文件时,它在cmd脚本中非常有用。 通过使用这个技巧,您可以简单地输出每个文件名,然后input一个空格,然后在循环之后输出一个换行符:

我的batch file(.cmd)有时会执行部分行

如何在Windows 8中使用cmd杀死进程名称的程序?

如何在Windows上设置PhoneGap

删除包含大量文件文件夹,并显示正在删除文件

我如何让我的Windows7符号链接从命令行执行?

Processing files: file1.txt file42.txt p0rn.zip

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

Processing files: file1.txtfile42.txtp0rn.zip

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

我试过引用,使用. (在echo ),甚至用^逃避string,但没有一个似乎工作:

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

我需要的是:

C:pax> some_magical_command_with_an_argument xyzzy xyzzy

这将在开始时给我空间, 并在结束时不会换行。

删除子目录中的所有文件除了给定的扩展名(在Windows BATCH中)

连接到variables的path列表 – 传递给CMD批处理脚本中的“java -classpath …”

从文本文件中读取一个variables

cmd编程中的速度和时间问题

自动有脚本input是在Windows CMD是/否提示

这与paxdiablo的答案非常相似,除了我使用混合JScript /批处理文件而不是临时VBScript文件

我的脚本被称为jEval.bat – 它只是评估任何有效的JScript表达式,并将结果写入标准输出,可选jEval.bat有换行符。 愚蠢的小脚本是非常有用的批处理编程。

假设jEval.bat不是在你的当前文件夹中,就是在PATH中的某个地方,那么你可以简单地做一些事情:

call jeval "' xyzzy'"

这是脚本。 这真的很简单。 大部分代码与文档,错误处理和内置的帮助系统有关。

@if (@X)==(@Y) @end /* harmless hybrid line that begins a JScrpt comment ::************ Documentation *********** ::: :::jEval JScriptExpression [/N] :::jEval /? ::: ::: Evaluates a JScript expression and writes the result to stdout. ::: ::: A newline (CR/LF) is not appended to the result unless the /N ::: option is used. ::: ::: The JScript expression should be enclosed in double quotes. ::: ::: JScript string literals within the expression should be enclosed ::: in single quotes. ::: ::: Example: ::: ::: call jEval "'5/4 = ' + 5/4" ::: ::: Output: ::: ::: 5/4 = 1.25 ::: ::************ Batch portion *********** @echo off if "%~1" equ "" ( call :err "Insufficient arguments" exit /b ) if "%~2" neq "" if /i "%~2" neq "/N" ( call :err "Invalid option" exit /b ) if "%~1" equ "/?" ( setlocal enableDelayedExpansion for /f "delims=" %%A in ('findstr "^:::" "%~f0"') do ( set "ln=%%A" echo(!ln:~3! ) exit /b ) cscript //E:JScript //nologo "%~f0" %* exit /b :err >&2 echo ERROR: %~1. Use jeval /? to get help. exit /b 1 ************ JScript portion ***********/ if (WScript.Arguments.Named.Exists("n")) { WScript.StdOut.WriteLine(eval(WScript.Arguments.Unnamed(0))); } else { WScript.StdOut.Write(eval(WScript.Arguments.Unnamed(0))); }

这不是使用set或其他cmd -internal的东西,但你可以使用cscript (也包括在标准的Windows安装)来做类似的事情。 你甚至可以通过使用创建临时的vbs文件来从cmd文件本身控制它(没有单独的文件来维护)。

将此代码放置在您的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

这是你期望的结果:

Hello,my name is pax.

你是这个意思吗?

@ECHO OFF SETLOCAL FOR /l %%i IN (1,1,4) DO <NUL SET /p var="item %%i "

结果:

项目1项目2项目3项目4

还是你一开始就坚持要一个空间?

好的,现在有正确的答案:你不能在Win7中拥有领先的<space>和set /p 。 Windows版本之间有区别:

Syntax | XP | Vista and Windows 7 ----------------------+-------------------------------------+------------------------------------- <nul set /p =!msg! |- If 1st char is quote,then trims |- Trims leading white space chars. or | that quote,and if at least one |- If 1st non white space char is <nul set /p "=!msg!" | additional quote,than trims last | quote,then that quote is treated | quote and all remaining chars. | as white space and trimmed,and if |- If 1st non trimmed char is =,then | at least one additional quote,then | Syntax error. | trims last quote and all remaining | | chars. | |- If 1st non trimmed char is =,then | | Syntax error. ----------------------+-------------------------------------+------------------------------------- <nul set /p ="!msg!" |- Trims leading control chars and |- Trims leading white space chars. or | spaces. |- If 1st non trimmed char is =,then <nul set /p "="!msg!""|- If 1st non trimmed char is =,then | Syntax error. | Syntax error. | ----------------------+-------------------------------------+------------------------------------- On Vista and Windows 7,the trimmed leading white space chars are: 9 0x09 Horizontal Tab 10 0x0A New Line 11 0x0B Vertical Tab 12 0x0C Form Feed 13 0x0D Carriage Return 32 0x20 Space 255 0xFF Non-breaking Space

资源

对于其他技术来获得纯批次的领先空间,请参阅此处

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐