
CODE: [Copy to clipboard]在前六行中,flag_n 与 flag_d 分别是记录参数中数字和目录个数的两个变量并在以后使用,其余不作过多解释。重点看看第7行到第17行,这是一个 if...else... 分支结构,第一个分支又被分割成为了两部分,p1,p2两个变量分别记录了 demo.cmd 所接收的参数1和参数2,所以整个部分被分成了可以用参数个数描述的,即无参数,一个参数,和两个参数三种情况。分别看看每种分支情况都执行了什么操作。:: demo.cmd 批处理参数处理演示 2000、XP ↑
:: by:无奈何 email:wunaihe@gmail.com 2005.11.17
1│@echo off
2│setlocal
3│set "p1=%~1"
4│set "p2=%~2"
5│set flag_d=0
6│set flag_n=0
7│if not defined p2 (
8│ if not defined p1 (
9│ set "directory=."
10│ ) else (
11│ set "directory=."
12│ call :_test "%p1%"
13│ )
14│) else (
15│ call :_test "%p1%"
16│ call :_test "%p2%"
17│ )
18│if %flag_n% == 2 echo 参数为两个数字 &goto :EOF
19│if %flag_d% == 2 echo 参数为两个目录 &goto :EOF
20│echo 目录为:%directory% 数字为:%number%
21│goto :EOF
22│
23│:_test
24│set "x=%~1"
25│set /a "y=x+1-1"
26│if "%y%" == "%x%" (
27│ set "number=%x%"
28│ set /a flag_n+=1
29│ ) else (
30│ pushd "%x%" 2>nul
31│ if errorlevel 1 set "directory=." &goto :EOF
32│ set "directory=%x%"
33│ set /a flag_d+=1
34│ popd
35│ )
36│goto :EOF
CODE: [Copy to clipboard][ Last edited by 无奈何 on 2005-11-27 at 15:02 ]:: demo2.cmd 批处理参数处理演示 2 2000、XP ↑
:: by:无奈何 email:wunaihe@gmail.com 2005.11.25
@echo off
rem xss [/I 输入路径] [/F 显示类型|/V 过滤类型] [/L 输出记录文件] [/O 输出路径]
setlocal
set /a n=0,m=1
set /a I=0,F=0,V=0,L=0,O=0
:loop
set "_temp=%~1"
if "%_temp%" == "" goto :star
if "%m%" == "1" (
echo "%_temp%" |findstr/i /r "\</I\> \</F\> \</V\> \</L\> \</O\>" 2>nul 1>&2
if errorlevel 1 echo 非识别参数 “%_temp%” &goto :EOF
)
set /a n=n+1,m=m+1
if /i "%_temp%" == "/I" set /a I=1,F=0,V=0,L=0,O=0,n=1
if /i "%_temp%" == "/F" set /a I=0,F=1,V=0,L=0,O=0,n=1
if /i "%_temp%" == "/V" set /a I=0,F=0,V=1,L=0,O=0,n=1
if /i "%_temp%" == "/L" set /a I=0,F=0,V=0,L=1,O=0,n=1
if /i "%_temp%" == "/O" set /a I=0,F=0,V=0,L=0,O=1,n=1
if "%n%" == "2" (
if "%I%" == "1" set "directory_i=%_temp%" &set m=1
if "%F%" == "1" set "filter_f=%_temp%" &set m=1
if "%V%" == "1" set "filter_v=%_temp%" &set m=1
if "%L%" == "1" set "log=%_temp%" &set m=1
if "%O%" == "1" set "directory_o=%_temp%" &set m=1
)
shift
goto loop
:star
echo.directory_i %directory_i%
echo.filter_f %filter_f%
echo.filter_v %filter_v%
echo.log %log%
echo.directory_o %directory_o%
goto :EOF
CODE: [Copy to clipboard][ Last edited by willsort on 2005-11-26 at 19:35 ]:: ArgParse.bat - Parser of command line arguments
:: Will Sort - 2005-11-26 - WinXP_CMD/MSDOS7.10/MSDOS6.22
@echo off
:Init
for %%e in (directory_i directory_o filter_f filter_v log) do set %%e=
:ParseLoop
if "%1"=="" goto Start
for %%s in (i I f F v V l L o O) do if "%1"=="/%%s" goto Switch%%s
echo Error: Invalid switch '%1'!
goto Quit
:SwitchI
if "%directory_i%"=="" set directory_i=%2
goto NextArg
:SwitchO
if "%directory_o%"=="" set directory_o=%2
goto NextArg
:SwitchF
if "%filter_f%"=="" set filter_f=%2
goto NextArg
:SwitchV
if "%filter_v%"=="" set filter_v=%2
goto NextArg
:SwitchL
if "%log%"=="" set log=%2
goto NextArg
:NextArg
shift
shift
goto ParseLoop
:Start
echo.directory_i %directory_i%
echo.directory_o %directory_o%
echo.filter_f %filter_f%
echo.filter_v %filter_v%
echo.log %log%
:Quit
for %%e in (directory_i directory_o filter_f filter_v log) do set %%e=
:end
CODE: [Copy to clipboard][ Last edited by willsort on 2005-11-30 at 12:24 ]:: ArgParse.bat - V2 - Parser of command line arguments
:: Will Sort - 2005-11-30 - WinXP_CMD/MSDOS7.10/MSDOS6.22
@echo off
:Init
for %%e in (directory_i directory_o filter_f filter_v log) do set %%e=
:ParseLoop
if "%1"=="" goto Start
for %%s in (l L i I o O f F v V) do if "%1"=="/%%s" goto Switch%%s
echo Error: Invalid switch '%1'!
goto Quit
:: 一个有设定值的开关,如果重复设定将取最后一个
:SwitchI
set directory_i=%2
goto Next2Arg
:: 一个有设定值的开关,如果重复设定将取第一个
:SwitchO
if "%directory_o%"=="" set directory_o=%2
goto Next2Arg
:: 一个有设定值的开关,如果重复设定将抛出错误后终止程序
:SwitchF
if not "%filter_f%"=="" echo Error: Replicative switch '%1'!
if not "%filter_f%"=="" goto Quit
set filter_f=%2
goto Next2Arg
:: 一个可能有设定值的开关,如果未在其后设定值,将取默认值
:SwitchV
set filter_v=default
for %%s in (l L i I o O f F v V) do if "%2"=="/%%s" goto NextArg
if not "%2"=="" set filter_v=%2
goto Next2Arg
:: 一个没有设定值的开关,只有启闭功能,重复设定将反复取反
:SwitchL
if "%log%"=="" set _log=on
if "%log%"=="on" set _log=off
if "%log%"=="off" set _log=on
set log=%_log%
set _log=
goto NextArg
:Next2Arg
shift
:NextArg
shift
goto ParseLoop
:Start
echo.directory_i %directory_i%
echo.directory_o %directory_o%
echo.filter_f %filter_f%
echo.filter_v %filter_v%
echo.log %log%
:Quit
for %%e in (directory_i directory_o filter_f filter_v log) do set %%e=
:end
| Quote: | |
|
CODE: [Copy to clipboard]还有一个疑问,相同条件的语句兄为什么不作合并。如::SwitchV
for %%s in (l L i I o O f F v V) do if "%2"=="/%%s" set filter_v=default
for %%s in (l L i I o O f F v V) do if "%2"=="/%%s" goto NextArg
set filter_v=%2
if "%2"=="" set filter_v=default
goto Next2Arg
CODE: [Copy to clipboard]这样可以减少一次循环,或者更简洁的将 if 句也合并,是兼容性的考虑吗?我不了解 DOS 下的问题。for %%s in (l L i I o O f F v V) do (
if "%2"=="/%%s" set filter_v=default
if "%2"=="/%%s" goto NextArg
)

| Quote: | |
|
| 欢迎光临 中国DOS联盟论坛 (http://cndos.fam.cx/forum/) | Powered by Discuz! 2.5 |