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

指南:

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

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

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


当前回答

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

set > test
dir test
del test

其他回答

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

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

删除周围的报价。

for /f "useback tokens=*" %%a in ('%str%') do set str=%%~a

我最近必须写一个批处理文件,由VS预构建事件调用,我想在项目目录中作为参数传递。在批处理文件中,我需要将路径与嵌套子文件夹名称连接起来,但首先需要删除周围的引号。

狡猾的等待N秒的技巧(不是cmd.exe的一部分,但不是额外的软件,因为它是Windows自带的),参见ping行。您需要N+1个ping,因为第一个ping没有延迟。

    echo %time%
    call :waitfor 5
    echo %time%
    goto :eof
:waitfor
    setlocal
    set /a "t = %1 + 1"
    >nul ping 127.0.0.1 -n %t%
    endlocal
    goto :eof

就像上面一样,使用CALL, EXIT /B, SETLOCAL和ENDLOCAL,你可以用局部变量和返回值来实现函数。

例子:

@echo off

set x=xxxxx
call :fun 10
echo "%x%"
echo "%y%"
exit /b

:fun
setlocal
set /a y=%1 + 1
endlocal & set x=%y%
exit /b

这将打印:

"11"
""

y变量永远不会离开局部作用域,但由于CMD一次解析一行的方式,您可以将值提取到父作用域的x变量中。

稍后可以使用call对名称求值,从而得到一些有用的属性。

call set SomeEnvVariable_%extension%=%%%somevalue%%%

使用调用来设置名称依赖于其他变量的变量。如果与某些变量命名规则一起使用,则可以通过使用谨慎的命名规则来模拟数组或字典等数据集合。somevalue周围的三个%是这样的,它将在调用之后和调用set之前计算为一个变量名,周围是一个%。这意味着一行中的两个%转义为一个%字符,然后它将再次展开它,因此somevalue实际上是一个名称指针。

call set TempVar=%%SomeEnvVariable_%extension%%%

将它与一个临时变量一起使用以检索值,然后可以在逻辑中使用该值。这在与延迟变量展开一起使用时非常有用。

要正确使用此方法,需要启用延迟变量扩展。因为它在默认情况下是关闭的,所以最好在脚本中启用它,将其作为第一个指令之一:

setlocal EnableDelayedExpansion