Пакетный файл Windows Несколько меток вплотную - PullRequest
2 голосов
/ 03 июля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...