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

指南:

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

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

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


当前回答

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

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

其他回答

SHIFT

这是一种在命令行上迭代传递到脚本(或子例程)的可变数量的参数的方法。在最简单的用法中,它将%2转换为%1,将%3转换为%2,依此类推。(你也可以传递一个参数给SHIFT来跳过多个参数。)这使得命令具有“破坏性”(即%1永远消失),但它允许您避免硬编码支持的参数的最大数量。

下面是一个简短的例子,一次处理一个命令行参数:

:ParseArgs

if "%1"=="" (
    goto :DoneParsingArgs
)

rem ... do something with %1 ...

shift

goto :ParseArgs


:DoneParsingArgs

rem ...

批处理文件中的数组。

设置一个值:

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%

整数运算:

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

我总是发现很难阅读每行用关键字标记的注释:

REM blah blah blah

易于阅读:

:: blah blah blah

一个非常古老(大约1990年)的技巧来获得环境变量的总大小:

set > test
dir test
del test