如何将 switch `/?` 传递给子例程而不被 `call` 处理?

How to pass switch `/?` over to a sub-routine without being processed by `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 /?.

的时候也会出现同样的问题

How can I pass that argument over to the sub-routine, so that it is only processed there but not by the call command?

参见下面的示例:

@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

call很贪心,连这个都会显示帮助画面

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

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

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

:sub
echo(Parameter: %*
exit /b

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

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