Windows批处理文件多个标签背对背

时间:2019-07-03 15:05:56

标签: windows batch-file cmd

在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等于abfalse,则将记录“ 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 -hmycmd --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“解决”了这个问题,但是我认为这样做的结果是很难将任意(可能是可选的)参数传递给批处理文件,并且可能应该以不同的方式进行解析比我所做的-或使用其他编码语言。也就是说,现在可以满足我的需求。

0 个答案:

没有答案