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

指南:

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

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

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


当前回答

Forfiles非常有用,例如,递归删除所有超过两天的文件

forfiles /D -2 /P "C:\Temp" /S /C "cmd /c del @path"

其他回答

输出一个空行:

echo.

'remove directory'上的子目录选项:

rd /s /q junk

批处理文件中的数组。

设置一个值:

set count=1
set var%count%=42

在命令行提取一个值:

call echo %var%count%%

从批处理文件中提取一个值:

call echo %%var%count%%%

注意额外的扫射%符号。

这项技术可能看起来有点复杂,但它非常有用。如上所述,将打印var1(即42)的内容。如果我们想将其他变量设置为var1中的值,也可以用set替换echo命令。这意味着下面的值在命令行是有效的赋值:

call set x=%var%count%%

然后查看va1的值:

echo %x%

关于使用::而不是REM进行评论:要小心!::是CALL标签的一种特殊情况,作用类似于注释。当在括号内使用时,例如在for或IF循环中,函数将提前退出。调试非常令人沮丧!

详细描述请参见http://www.ss64.com/nt/rem.html。

(添加一个新的答案,而不是上面第一次提到的评论,因为我还不值得评论:0)

基于行的执行

虽然在大多数情况下没有明显的好处,但当试图在运行时更新内容时,它会有所帮助。例如:

UpdateSource.bat

copy UpdateSource.bat Current.bat
echo "Hi!"

Current.bat

copy UpdateSource.bat Current.bat

现在,执行Current.bat会产生这样的输出。

HI!

注意,批处理执行是按行号进行的。如果基本行没有完全相同的行号,这样的更新可能会导致跳过或向后移动一行。