Cmd 为什么这个命令会崩溃?
我遇到了一个让人震惊的问题,使控制台崩溃了:Cmd 为什么这个命令会崩溃?,cmd,Cmd,我遇到了一个让人震惊的问题,使控制台崩溃了: set "h=/?" & call [if | for | rem] %%h%% IF,FOR和REM。 他们使用自己的特殊解析器,这可能导致一些截取错误,所以它崩溃了 @jeb指出了调用,但将其转换为“令牌”(取决于版本): &返回/ &返回1 |返回2 |返回0 /?返回启动第二轮解析器所需的调用 但有一个小错误(或更多),在该阶段,不可能执行任何特殊命令或使用&、|、&&、|、重定向或命令块 原因似乎是解析器
set "h=/?" & call [if | for | rem] %%h%%
,IF
和FOR
。 他们使用自己的特殊解析器,这可能导致一些截取错误,所以它崩溃了REM
调用
,但将其转换为“令牌”(取决于版本):
返回&
/
返回&
1
返回|
2
返回|
0
返回启动第二轮解析器所需的/?
调用 但有一个小错误(或更多),在该阶段,不可能执行任何特殊命令或使用
、&
、|
、&&
、重定向或命令块 原因似乎是解析器在内部构建了一个令牌图,将特殊事物替换为某种令牌值。|
但是使用
时,执行者不再知道如何处理它们 此代码尝试执行名为CALL
3.bat的批处理文件
(名称可以不同,具体取决于windows版本) 但在您的示例中,帮助功能是在不可执行令牌上触发的。
这似乎是刽子手完全失去理智的最终死亡诱因。研究总结: 调用linefeeds
或\n
,FOR
和IF
的帮助函数会导致cmd崩溃,退出时出现REM
-1073741819 aka 0xC0000005,表示访问冲突错误 首先,cmd解析器尝试启动ERRORLEVEL
以终止进程。 如果您提前终止werfault,将出现一条错误消息! 访问冲突错误:werfault
0x00007FF7F18E937B处的指令引用0x0000000000000070处的内存。内存无法读取 据推测,
、if
和for
使用特殊的解析器,但是当调用rem
触发帮助功能时,返回一个非命令令牌,这会使cmd解析器崩溃
资料来源:
为什么不问问脚本的作者@npocmaka?(虽然我猜,它被列在“bugs”下是有原因的)被否决的不是我。我为什么要这样做?我刚才提到作者是为了让你有最大的机会得到答案。三周前呢?我不记得了(可能不记得)。如果你告诉我哪个Q/A,我会告诉你。C:\>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!!!
set "cmd=(a) & (b)" call %%cmd%%