В 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
, но я думаю, что результатом этого является то, что довольно сложно передать произвольные, потенциально необязательные параметры в пакетные файлы, и, вероятно, их следует анализировать иначе, чем я- или используя другой язык кодирования.Тем не менее, теперь он работает нормально для того, что мне нужно.