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

指南:

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

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

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


当前回答

就像上面一样,使用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变量中。

其他回答

当向批处理文件传递未知数量的参数时,例如,当几个文件被拖放到批处理文件上以启动批处理文件时,您可以通过名称引用每个参数变量。

TYPE %1
TYPE %2
TYPE %3
TYPE %4
TYPE %5
...etc

但是当你想要检查每个参数是否存在时,这就变得非常混乱了:

if [%1] NEQ [] (
TYPE %1
)
if [%2] NEQ [] (
TYPE %2
)
if [%3] NEQ [] (
TYPE %3
)
if [%4] NEQ [] (
TYPE %4
)
if [%5] NEQ [] (
TYPE %5
)
...etc

此外,使用这种方法只能接受有限数量的参数。

相反,尝试使用SHIFT命令:

:loop
IF [%1] NEQ [] (
TYPE %1
) ELSE (
GOTO end
)
SHIFT
GOTO loop
:end

SHIFT将把所有参数都向下移动一个,因此%2变成%1,%3变成%2,等等。

继续行:

call C:\WINDOWS\system32\ntbackup.exe ^
    backup ^
    /V:yes ^
    /R:no ^
    /RS:no ^
    /HC:off ^
    /M normal ^
    /L:s ^
    @daily.bks ^
    /F daily.bkf

没有提供太多的功能,但是您可以将title命令用于一些用途,比如在任务栏中提供长脚本的状态,或者只是增强用户反馈。

@title Searching for ...
:: processing search
@title preparing search results
:: data processing

我想说DEBUG.EXE是批处理文件中一个非常有用但却未被充分利用的特性。

DEBUG命令允许你…

汇编和反汇编16位代码 读/写内存(现代受保护的内存使这个功能变得不那么有用。) 从硬盘读取数据扇区,原始 十六进制编辑

简而言之,这个工具非常强大。现在可能已经不怎么使用了,但是从批处理脚本调用和控制这个功能的能力为批处理脚本增加了惊人的能力。

注意:据我所知,微软已经从64位版本的Windows Xp和Vista中删除了这个命令,并打算从Windows 7中完全删除它。

在脚本中使用命令扩展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将不会恢复它们。