在批处理程序中执行条件处理。如果 if 命令中指定的条件为真,Windows 将执行该条件后的命令。如果条件为假,Windows 将忽略 if 子句中的命令,并执行 else 子句中的任何命令(如果已经指定了命令)。
if [not] errorlevel number command [else expression]
if [not] string1==string2 command [else expression]
if [not] exist filename command [else expression]
启用了命令扩展:
if [/i] string1 compare-op string2 command [else expression]
if cmdextversion number command [else expression]
if defined variable command [else expression]
参数
not
指定只有当条件为假时 Windows 才能执行该命令。
errorlevel number
只有当前一个程序返回大于或等于 number 的退出代码时,才能指定真条件。
command
指定在符合前面的条件时 Windows 将执行的命令。
string1==string2
只有当 string1 和 string2 相同时才能指定真条件。这些值可以是文字字符串或批处理变量(例如,%1)。文字字符串不需要引号。
exist filename
如果 filename 存在,则指定真条件。
compare-op
以下三字母比较操作符中的一个:
操作符 说明 EQU 等于 NEQ 不等于 LSS 少于 LEQ 少于或等于 GTR 大于 GEQ 大于或等于
/i
指定 /i 开关时,将强制字符串比较按忽略大小写情况进行。/i 开关也可以用于 if 的 string1==string2 格式。这些比较是通用的,如果 string1 和 string2 都由所有的数字组成,那么字符串将被转换为数字并且将执行数字比较。
cmdextversion number
cmdextversion 条件的作用就像是 errorlevel,但它需要与 Cmd.exe 的“命令扩展”功能相关联的内部版本号比较。第一版是 1,当重大的增强添加到命令扩展中时,版本号将增加 1。当禁用命令扩展时,cmdextversion 条件不会为真。
defined variable
defined 条件的作用就象是 exist,但它使用环境变量名,并且如果环境变量已经定义它将返回真值。使用该条件添加三个变量:%errorlevel%, %cmdcmdline% 和 %cmdextversion%。
%errorlevel% 扩展到 errorlevel 当前值的字符串表达式,如果没有名为 ERRORLEVEL 的环境变量,在这种情况下可取代它的值。程序运行后,下面的图解 errorlevel 使用:
goto answer%erorlevel% :answer0 echo Program had return code 0 :answer1 echo Program had return code 1
也可以在 compare-op 中使用上面列出的比较操作符:
if %errorlevel% LEQ 1 goto okay
%cmdcmdline% 在任何 Cmd.exe 处理之前扩展传递到 Cmd.exe 的源命令行,如果没有名为 cmdcmdline 的环境变量,在这种情况下可取代它的值。
%cmdextversion% 扩展到 cmdextversion 当前值的字符串表达式,如果没有名为 CMDEXTVERSION 的环境变量,在这种情况下可取代它的值。
expression
在 else 子句中,expression 由 Windows 命令和任何传递到命令的参数组成。
附加一个实例,都是转的……谢谢作者
1。判断目录或文件的存在,来从服务器同步文件到本地
如D:\pubclt 目录被客人删除。可以用这种办法解决(注:我的服务器为fyt200)
@echo off
if exist tmp.txt del /q tmp.txt
for /f %%i in ('dir /a /b D:\pubclt\pubwin.exe') do echo %%i>>tmp.txt
if exist tmp.txt (goto 11) else (goto 12)
if exist tmp.txt del /q tmp.txt
:11
@echo -----------------------------
@echo 客户端无需更新.
@echo -----------------------------
goto q
:12
xcopy \\fyt200\share\pubclt d:\pubclt\ /s /f /y /q & \\fyt200\share\soft\control\pubwin.exe
d:\pubclt\pubwin.exe
@echo -----------------------------
@echo ....客户端更新完毕...........
@echo -----------------------------
:q
exit
这个批处理的意思是查找d盘中pubclt目录下的pubwin.exe文件,如果查找存在,则goto 11,如不存在则 goto12 其实这种办法可以用if exist 和if not exist命令实现,但是本人觉得这个会更好用一些。处理面也会广很多。
2。对比服务器的某个目录,删除多余的目录和文件。(注:我的服务器为fyt200)
@echo -----------------------------
@echo .同步更新磁盘D中所有和文件夹.
@echo -----------------------------
@echo .
cd /d d:
for /f "usebackq delims=" %%A in (`dir /a /b`) do (attrib "%%A" -r -h -s)
for /d %%A in ("d:\*") do if not exist "\\fyt200\share\%%~nA" rd /s /q "%%A"
for %%A in ("d:\*") do if not exist "\\fyt200\share\%%~nA" del /f /q "%%A"
这个大家一定要设置好来,比如你常用的d盘目录, netgame langame program files bak 下载区 等这些目录一定要在服务器上有,否则会无情的被删除。要是整个网吧都被删除了,呵呵不要怪我,dos下删除文件的速度是惊人的快的。。大家一定要先修改好自己的服务器路径。
3。隐藏d盘根目录中的所有文件和文件夹
cd /d d:
for /f "usebackq delims=" %%A in (`dir /a /b`) do (attrib "%%A" -r +h -s)
这个懂点批处理的人可能都懂,不多解释
4。在批处理中使用密码。当然只是简单的批处理,没有办法使用星号密码,技术还没有到那个地步。呵呵。。
@echo off
set num=0
:11
set /p pass=请输入密码:
if "%pass%"=="admin" goto next1
set /a num=%num% + 1
if %num%==3 goto no1
goto 11
:no1
%windir%\system32\rundll32.exe user32.dll,LockWorkStation
goto 11
:next1
pause
这个批处理的意思是:先设置num为0。密码为admin 输入正确,跳转到next1 ,若密码输入错误一次,则num加1,若3此输入密码错误则锁屏。。
另:批处理做好后,最好是使用QUICKbat等软件把文件属性改为幽灵文件。然后编译为EXE文件。或者用vbs文件后台执行,vbs这个网上都很流行。如:
DIM objShell
set objShell=wscript.createObject("wscript.shell")
iReturn=objShell.Run("cmd.exe /C\\192.168.0.200\share\soft\control\client.bat", 0, TRUE)