批处理命令行参数匹配
问题描述:
我真的不明白为什么拒绝工作。批处理命令行参数匹配
@ECHO OFF
SET CURRDIR=%CD%
if [%1%]==[1] GOTO ONE
if [%1%]==[2] GOTO TWO
if [%1%]==[3] GOTO THREE
:ONE
call "%CURRDIR%\PlanningProduct.bat"
:TWO
call "%CURRDIR%\Organization.bat"
:THREE
call "%CURRDIR%\Measure.bat"
pause
我没有在命令行
I:\BatchMania>I:\BatchMania\Home.bat 1
和输出我得到的是搞笑如下如下:
Planning
Organization
Measure
Press any key to continue . . .
这很奇怪。希望永远不要写这种代码!!!
答
以下是否产生了您的期望?
:ONE
call "%CURRDIR%\PlanningProduct.bat"
GOTO OUT
:TWO
call "%CURRDIR%\Organization.bat"
GOTO OUT
:THREE
call "%CURRDIR%\Measure.bat"
:OUT
pause
+0
谢谢埃里克。这使得敏感和它的作品。我认为标签只能与goto一起使用。 – Nishant 2011-05-07 09:55:00
答
在它接到ONE并执行呼叫后,它将继续在下一行(TWO)。标签不会更改执行顺序,它仍然会逐行解析文件,除非您跳到某处。
要么跳开到一个特定的点:
...
:ONE
call "%CURRDIR%\PlanningProduct.bat"
GOTO DONE
:TWO
...
:DONE
pause
或结束该批次:
:ONE
call "%CURRDIR%\PlanningProduct.bat"
pause
GOTO :EOF
+0
谢谢安德斯。我认为标签只能与goto一起使用。它现在有效 – Nishant 2011-05-07 09:55:24
答
有需要注意这里的几个项目:
- 您已经实现了“ 下翻“情景,其中THREE或TWO + THREE在2个区别中执行ct case或ONE + TWO + THREE 全部其他情况;
- 我其实不认为
if
声明按预期工作:[%1%]==[1]
应该是[%1%]==[1%]
或[%1]==[1]
; - 当此脚本从根目录运行时,如果双反斜杠成为问题,则考虑使用
%__CD__%
; - 如果您只使用
goto batch%~1
(或类似)并重命名标签,则可以省略所有if
语句; OR - 如果您只指定在
if
声明中调用的批处理和/或使用if-else
构造,则可以省略所有编号标签。
这里有一些可选择的实现:
@ECHO OFF
set CURRDIR=%CD%
goto :BATCH%~1 2>NUL
goto :UHOH
:BATCH1
call "%CURRDIR%\PlanningProduct.bat"
goto :DONE
:BATCH2
call "%CURRDIR%\Organization.bat"
goto :DONE
:BATCH3
call "%CURRDIR%\Measure.bat"
goto :DONE
:UHOH
echo Invalid parameter "%~1"
:DONE
pause
@ECHO OFF
set CURRDIR=%CD%
if "%~1"=="1" (
call "%CURRDIR%\PlanningProduct.bat"
) else if "%~1"=="2" (
call "%CURRDIR%\Organization.bat"
) else if "%~1"=="3" (
call "%CURRDIR%\Measure.bat"
) else (
echo Invalid parameter "%~1"
)
pause
@ECHO OFF
set CURRDIR=%CD%
set BAT=
if "%~1"=="1" set BAT=PlanningProduct.bat
if "%~1"=="2" set BAT=Organization.bat
if "%~1"=="3" set BAT=Measure.bat
call "%CURRDIR%\%BAT%" 2>NUL
pause
什么是您预期的输出? – MartW 2011-05-07 09:45:20