【问题标题】:How to pass switch `/?` over to a sub-routine without being processed by `call`?如何在不被“调用”处理的情况下将开关“/?”传递给子例程?
【发布时间】:2016-12-18 21:44:58
【问题描述】:

假设你有以下代码sn-p:

@echo off
call :SUB /?
exit /B

:SUB
>&2 echo %*
exit /B

call 命令识别/? 开关并显示其帮助消息。我怎样才能将该参数传递给子例程,以便它只在那里处理而不是由call 命令处理?是否有一个聪明的转义序列来实现这一点?

到目前为止,我尝试了一些转义序列,如call :SUB ^/?call :SUB /^?call :SUB ^/^?call :SUB^ /?,以及奇怪的语法call :SUB(/?(它不会引发语法错误,令人惊讶;类似于广泛使用的安全 echo() 的语法,但到目前为止还没有运气。

在命令提示符下,写call echo /?之类的东西也会出现同样的问题。

【问题讨论】:

  • call :SUB "/?",如果您可以接受引号或可以在子例程中使用%~1
  • 好主意,@Stephan,但这只有在 /? 是唯一参数时才有效...
  • 这就是为什么它是评论,而不是答案。 ;)
  • 这仅在 /?是唯一的论点。 这取决于您的子例程。如果你想回显所有参数,它会。但是,如果您想分别回显每个 arg,它也可以,例如:set "ars= %*" & echo %~1 !ars: %~1=!
  • @sambul35,我在子程序中使用了echo作为例子;问题是call 自己消耗/?...

标签: batch-file cmd escaping call


【解决方案1】:

call很贪心,即使这样也会显示帮助画面

call :sub ^/;;===,,,,,?

但这可以通过辅助变量来完成。

@echo off
set "var=/?"
call :sub %%var%%
exit /B

:sub
echo(Parameter: %*
exit /b

其他信息
/?用作标签时还有其他奇怪的效果,那么/?可以用于anonymous functions

@echo off
set "anonymous=/?"
call :%%anonymous%% argument >nul
if "%0"==":/?" (
  echo func arg=%1 > con
  exit /b
)
echo End

【讨论】:

    【解决方案2】:

    如何将该参数传递给子例程,以便仅在此处处理而不由 call 命令处理?

    请看下面的例子:

    @echo off
    setlocal enabledelayedexpansion
    call :SUB "/?" Hello
    exit /b
    
    :SUB
    set "ars= %*"
    echo %~1 & echo/ & echo !ars: %1=! 
    exit /b
    
    :: Output
    Displays messages, or turns command-echoing on or off.
    
      ECHO [ON | OFF]
      ECHO [message]
    
    Type ECHO without parameters to display the current echo setting.
    
     Hello
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 2022-06-14
      • 2015-11-18
      相关资源
      最近更新 更多