Windows批处理文件有哪些不太为人所知,但很重要和有用的特性?
指南:
每个答案一个特征 给出特性的简短描述和示例,而不仅仅是文档链接 将答案限制在本地功能,即不需要额外的软件,如Windows资源包
澄清:这里我们指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(请参见:Windows批处理文件:.bat vs .cmd?)
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,但是这样你就可以在测试和条件之间使用命令,并根据需要反复测试条件。
其他回答
对于具有数字计数器的循环(输出1到10):
for /l %i in (1,1,10) do echo %i
子字符串变量:
> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
一个非常古老(大约1990年)的技巧来获得环境变量的总大小:
set > test
dir test
del test
基于行的执行
虽然在大多数情况下没有明显的好处,但当试图在运行时更新内容时,它会有所帮助。例如:
UpdateSource.bat
copy UpdateSource.bat Current.bat
echo "Hi!"
Current.bat
copy UpdateSource.bat Current.bat
现在,执行Current.bat会产生这样的输出。
HI!
注意,批处理执行是按行号进行的。如果基本行没有完全相同的行号,这样的更新可能会导致跳过或向后移动一行。
softwarejedi已经提到了for命令,但我将再次提到它,因为它非常强大。
下面以YYYYMMDD格式输出当前日期,我在生成备份目录时使用此格式。
for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a