在PHP或Javascript以及其他语言中,也有switch, case
语句作为控制流工具。它的一项巧妙功能是它允许将多个cases
指向一个命令组。例如:
switch(abc) {
case a:
case b:
case false:
console.log("hi")
break;
case c:
console.log("see ya")
break;
etc...
}
因此,如果abc
等于a
或b
或false
,则将记录“ Hi” 。根据代码的不同,它比从对象或大量if else or if x || y || z
语句中调用要干净得多。
我有一个Windows批处理文件,在其中执行以下操作:
GOTO %1
..... stuff
.... more stuff
REM =================LABELS BELOW==============
:-h
:--help
:-?
:--?
type help.txt
exit /b
比上面的伪代码更详细,但这就是要点。它为相同的参数提供别名,并且有效。如果执行mycmd -h
或mycmd --help
等,我将帮助屏幕上显示的帮助文件文本。
但是,在输出的最后一行,出现错误THE SYSTEM CANNOT FIND THE BATCH LABEL SPECIFIED -
。
该错误可能是由其他原因引起的。我有一些CALL
命令和GOTO :EOF
语句,因此肯定是错误的根源。
但是我从未见过在批处理文件中使用之前在逻辑上应用过的逻辑,我想知道是否还有其他一些我可能没有考虑的副作用。我将来可能会遇到无法预测的副作用吗?这是出于任何原因的不良做法吗?
更新:
我尚未发布代码,因为我认为这很难阅读,并且正在进行中。基本上,您在这里看到的是参数解析。我正在将传递的值解析为类别-想象这个例子:node --file=d.js
。我称--file
为参数,d.js
为参数。而且下面的许多代码都创建了每个数组。
@echo off
SETLOCAL enabledelayedexpansion
@SET "T=%1"
IF /i NOT DEFINED T (GOTO -h)
SET /a counter=1
SET /a argCount=0
SET /a index=0
for %%x in (%*) do set /A argCount+=1
for /l %%x in (1,2,%argCount%) do (
call SET param[!index!]=%%!counter!
set /a counter+=2
SET /a index+=1
)
SET /A paramCount=!index!
SET /a counter=2
SET /a index=0
for /l %%x in (2,2,%argCount%) do (
call SET arg[!index!]="%%!counter!"
set /a counter+=2
SET /a index+=1
)
for /l %%i in (0,1,!paramCount!) do (
SET "arg=!ARG[%%i]!"
SET "p=!param[%%i]!"
CALL :!p! !arg!
)
GOTO END
:-h
:--help
:--?
:-?
type %~dp0\lib\help.txt
GOTO END
:--unzip
SET "a=%1"
IF /i NOT DEFINED a (
SET "MASK=\d+-[a-z]+.zip"
) ELSE if [%a%]==["all"] (
SET "MASK=\d+-[a-z]+.zip"
) else (
SET "MASK=!a!"
)
for /f "usebackq tokens=*" %%i in (`dir /a /b %dls%^|grep -iE "!MASK!"`) do (
@7z x %dls%\%%i -omypath\share\icons
)
GOTO :EOF
:END
@echo Done
ENDLOCAL
更新:我不知道这是否对任何人都有用,但是问题出在SET /A paramCount=!index!
上。不管怎样,总要寻找带有参数的参数,因此,如果我的第二个参数没有参数,或者没有,则可能会引起问题。我通过将paramCount
设置为!index!-1
“解决”了这个问题,但是我认为这样做的结果是很难将任意(可能是可选的)参数传递给批处理文件,并且可能应该以不同的方式进行解析比我所做的-或使用其他编码语言。也就是说,现在可以满足我的需求。