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

指南:

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

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

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


当前回答

可以使用errorlevel检查批处理文件将要运行的系统(当前目录或路径)上是否存在给定的程序。为了让测试的程序正常运行,退出并设置退出码。在这个例子中,我用了-?作为myExe的参数,大多数CLI程序都有类似的参数,如-h,——help, -v等…这确保它只是运行并退出,并将错误级别设置为0

myExe -? >nul 2>&1 
Set errCode=%errorlevel%
@if %errCode% EQU 0 (
    echo myExe -? does not return an error (exists)
) ELSE (
    echo myExe -? returns an error (does not exist)
)

是的,你可以直接测试errorlevel,而不是将其分配给errCode,但是这样你就可以在测试和条件之间使用命令,并根据需要反复测试条件。

其他回答

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

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

设置环境变量时的搜索和替换:

> @set fname=%date:/=%

...从日期中删除“/”以用于带时间戳的文件名。

还有子字符串……

> @set dayofweek=%fname:~0,3%

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

无论如何,这是一个很好的Windows CMD或批处理文件的在线参考。我学到了一些我不知道的东西。

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

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,等等。