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

指南:

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

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

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


当前回答

softwarejedi已经提到了for命令,但我将再次提到它,因为它非常强大。

下面以YYYYMMDD格式输出当前日期,我在生成备份目录时使用此格式。

for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a

其他回答

使用管道'|'命令查找文件夹中的文件中的字符串:

dir /b *.* | findstr /f:/ "thepattern"
SHIFT

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

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

:ParseArgs

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

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

shift

goto :ParseArgs


:DoneParsingArgs

rem ...

这里将介绍如何通过扫描给定目录来构建CLASSPATH。

setlocal ENABLEDELAYEDEXPANSION
if defined CLASSPATH (set CLASSPATH=%CLASSPATH%;.) else (set CLASSPATH=.)
FOR /R .\lib %%G IN (*.jar) DO set CLASSPATH=!CLASSPATH!;%%G
Echo The Classpath definition is %CLASSPATH%

适用于XP(或更好)。对于W2K,您需要使用两个BAT文件来实现相同的结果(请参阅在类路径定义中包含所有jar)。

在1.6版本中不需要它,因为你可以直接在CLASSPATH中指定通配符(例如-cp ".\lib*")。

为了从脚本内部解析stdin,你需要使用For和FIND命令:

for /f "tokens=*" %%g in ('find /V ""') do (
     :: do what you want with %%g
     echo %%g
)

使用空格和转义字符完全控制输出:

echo.    ^<resourceDir^>/%basedir%/resources^</resourceDir^>