Windows批处理文件有哪些不太为人所知,但很重要和有用的特性?

指南:

每个答案一个特征 给出特性的简短描述和示例,而不仅仅是文档链接 将答案限制在本地功能,即不需要额外的软件,如Windows资源包

澄清:这里我们指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。

(请参见:Windows批处理文件:.bat vs .cmd?)


当前回答

相当于bash(和其他shell)

echo -n Hello # or
echo Hello\\c

输出“Hello”,后面没有换行符。一个cmd黑客来做这个:

<nul set /p any-variable-name=Hello

Set /p是一种提示用户输入的方法。它发出给定的字符串,然后等待(在同一行,即没有CRLF),等待用户输入响应。

<nul只是向set /p命令输送一个空响应,因此最终结果是发出的提示字符串。(由于响应为空,所使用的变量保持不变。)

问题是:不可能输出前导等号,在Vista中前导空白字符被删除,但在XP中没有。

其他回答

这个批处理文件既可以使用简单文件,也可以使用目录作为命令行参数(您可以以任何顺序混合它们)。循环在任何指定的文件上运行命令(本例中为'echo'),如果一个参数是一个目录,它将在其中的每个文件上递归地运行命令。

@echo off
for /f "delims=" %%f in ('dir %* /a-d /b /s') do echo %%f

脚本所在的路径(带驱动器):~dp0

set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%

整数运算:

> SET /A result=10/3 + 1
4

对于具有数字计数器的循环(输出1到10):

for /l %i in (1,1,10) do echo %i

在脚本中使用命令扩展shell选项时,强烈建议您在脚本开始时执行以下技巧。

——从http://www.ss64.com/nt/setlocal.html粘贴的信息

如果给定一个参数,SETLOCAL将设置一个ERRORLEVEL。如果给出两个有效参数中的一个,它将为0,否则为1。 你可以在批处理文件中使用它来确定命令扩展名是否可用,使用以下技术:

VERIFY errors 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 echo Unable to enable extensions

这是因为“VERIFY errors”将ERRORLEVEL设置为1,然后如果扩展不可用(例如,如果脚本在command.com下运行),SETLOCAL将无法重置ERRORLEVEL值。 如果命令扩展被永久禁用,那么SETLOCAL ENABLEEXTENSIONS将不会恢复它们。