我在Windows cmd.exe
(至少高达XP)中有一个漂亮的技巧来模拟没有换行符echo -n
的UNIX回声的行为。例如,命令:
<nul: set /p junk= xyzzy
将导致输出正好六个字符,前导空格和字符串“xyzzy”,而不是其他任何内容。
如果您对为什么感兴趣,它实际上是一个输入命令,输出
" xyzzy"
作为提示然后在将该输入分配给{{1}之前等待用户输入环境变量。在这种特殊情况下,它不会等待用户输入,因为它会抓取junk
设备的输入。
当{(1}}脚本(例如)处理循环中的文件(每个文件一次迭代)时,它在每行列出多个列表时非常有用。通过使用这个技巧,您可以简单地输出每个文件名后跟一个空格而不是换行符,然后在循环之后输出换行符来完成:
nul
现在我发现,在Windows 7下,空格不再输出,所以我得到的是:
cmd
有没有办法让Processing files:
file1.txt file42.txt p0rn.zip
再次开始尊重我的空间,或者在Win7中有另一种方法可以达到同样的效果吗?
我尝试使用Processing files:
file1.txtfile42.txtp0rn.zip
(可在set /p
中使用)进行引用,甚至使用.
转义字符串,但它们似乎都不起作用:
echo
我需要的是:
^
这将在开头给我空间,在最后没有换行。
答案 0 :(得分:1)
这与paxdiablo的答案非常相似,除了我使用混合JScript /批处理文件而不是临时VBScript文件。
我的脚本名为jEval.bat
- 它只是评估任何有效的JScript表达式并将结果写入stdout,可选择使用尾随换行符。这个愚蠢的小脚本对于批量编程非常有用。
假设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)));
}
答案 1 :(得分: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
这是你所期望的结果:
Hello, my name is Pax.
答案 2 :(得分:0)
好的,现在得到正确的答案:你不能在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
有关以纯批次方式获取前导空格的其他技巧,请参阅here
答案 3 :(得分:0)
你的意思是这样吗?
@ECHO OFF
SETLOCAL
FOR /l %%i IN (1,1,4) DO <NUL SET /p var="item %%i "
结果:
第1项第2项第3项第4项
或者你一开始绝对坚持一个空间吗?