【发布时间】:2020-02-22 01:53:23
【问题描述】:
我遇到了一个令人兴奋的weird script,它使控制台崩溃:
set "h=/?" & call [if | for | rem] %%h%%
-
IF、FOR和REMaren't normal internal commands。 他们使用自己的特殊解析器,这可能会导致一些拦截错误,因此崩溃。
@jeb指出CALLdoesn't execute the following special characters,而是将它们转换为“令牌”(取决于版本):
-
&返回/ -
&&返回1 -
|返回2 -
||返回0 -
/?返回< -
@返回+ -
@()返回;
-
@if a==a :返回, -
@for %a in () do :返回+ -
@rem :返回-
然而,即使它们有独特的解析器,它仍然不能解释为什么它们都会崩溃。所以我做了一些测试:
- 删除
callC:\>set "h=/?" & for %h% %%h%% was unexpected at this time.
- 将命令更改为其他内容。 (我尝试了所有其他内部命令,没有一个有效)
- 分开两个命令:
C:\>set "h=/?" C:\>call for %%h%% --FOR help message--
- 添加
@C:\>set "h=/?" & call for @%%h%% CRASH!!!
- 用
()包围脚本块C:\>set "h=/?" & call for (%%h%%) CRASH!!!
问题摘要:
-
call起什么作用? - 是什么导致解析器崩溃?
【问题讨论】:
-
为什么不问问那个脚本的作者@npocmaka? (虽然我猜,它被列在“bugs”下是有原因的)
-
投反对票的不是我。我为什么要?我刚刚提到了作者,以最大限度地提高您获得答案的机会。三周前?我不记得了(可能不是)。如果你告诉我哪个 Q/A,我会告诉你。
标签: cmd