如何将`/?`切换到子程序而不被`call`处理?

时间:2016-08-12 01:23:11

标签: batch-file cmd escaping call

假设您有以下代码段:

@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 /?的内容时会出现同样的问题。

1 个答案:

答案 0 :(得分: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