Windows批处理文件有哪些不太为人所知,但很重要和有用的特性?
指南:
每个答案一个特征 给出特性的简短描述和示例,而不仅仅是文档链接 将答案限制在本地功能,即不需要额外的软件,如Windows资源包
澄清:这里我们指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(请参见:Windows批处理文件:.bat vs .cmd?)
Windows批处理文件有哪些不太为人所知,但很重要和有用的特性?
指南:
每个答案一个特征 给出特性的简短描述和示例,而不仅仅是文档链接 将答案限制在本地功能,即不需要额外的软件,如Windows资源包
澄清:这里我们指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(请参见:Windows批处理文件:.bat vs .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,等等。
其他回答
允许您更改目录基于环境变量没有 必须指定'%'指令。如果指定的变量没有 存在,然后尝试目录名。
@if defined %1 (call cd "%%%1%%") else (call cd %1)
将错误级别设置为你想要的任何数字的方法:
CMD /C EXIT number
Forfiles非常有用,例如,递归删除所有超过两天的文件
forfiles /D -2 /P "C:\Temp" /S /C "cmd /c del @path"
犯错就放弃。
IF "%errorlevel%" NEQ "0" (
echo "ERROR: Something broke. Bailing out."
exit /B 1
)
ENDLOCAL使用的行仍然解析局部变量。这就允许了以下技巧:
ENDLOCAL & SET MYGLOBAL=%SOMELOCAL% & SET MYOTHERGLOBAL=%SOMEOTHERLOCAL%
这是一种将结果传输到调用上下文的有用方法。具体来说,一旦ENDLOCAL完成,% somlocal%就超出了作用域,但那时% somlocal%已经展开,因此MYGLOBAL在调用上下文中使用局部变量赋值。
出于同样的原因,如果你决定这样做:
ENDLOCAL & SET MYLOCAL=%MYLOCAL%
您将发现新的MYLOCAL变量现在实际上是一个常规环境变量,而不是您希望它成为的局部变量。