批处理文件重新加载自动运行缓冲区

BATCH file reloading autorun buffer

为了让生活更轻松,有些事情我们宁愿不去理解。 但这不是我可以选择的...

我制作了一个批处理文件(或macro.doskey)来获取字符集代码。并且在很长一段时间内都完美运行...

基本上它运行 chcp:

> chcp
Code page active: 850

然后在冒号
前后包裹return 将后面的内容分配给变量:

FOR /F "tokens=1,* delims=:" %%s in ('CHCP') do (
  @ECHO %%t
  IF NOT "%1" == "" (SET %1=%%t)
)

例如:

> getCHCP.bat myVar
 850
> ECHO %myVar%
 850

但是它开始锁定,等待 ENTER 或显示多个回显消息。例如:

> getchcp myVar
ECHO is off.
ECHO is off.
ECHO is off.
ECHO is off.
ECHO is off.
ECHO is off.
ECHO is off.
ECHO is off.
 850

我开始混音,直到我决定将 ECHO %%t 更改为 ECHO %%s,你猜怎么着?

不对,那是比尔盖茨的头骨吗?是微软的彩蛋吗?病毒? 不,其中 none,这只是我的自动运行的欢迎信息。

这个可以配置在 <[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor]autorun>

在我的例子中,我调用了一个批处理文件,除其他外,它给出了几个在屏幕上显示这个头骨的回声。

很明显,你已经指出了问题。

this is just my autorun's welcome message.

This can be configured in <[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor]autorun>

FOR /F %%s in ('CHCP') ... 开始 CHCP 但这将在 NEW 子 cmd.exe 实例中完成。
NEW cmd.exe 实例运行 autorun 命令!
就在它开始你的 chcp 之前。

您可以完全禁用自动运行,或添加一些代码来检测用户的新 cmd.exe 实例与来自 FOR /F.

的新实例之间的差异

将此代码放在自动运行批处理文件的开头

@echo off

setlocal EnableDelayedExpansion
REM *** ALWAYS make a copy of the complete CMDCMDLINE, else you destroy the originial!!!
set "_ccl_=!cmdcmdline!"

REM *** %1 contains only data, when the script itself was called from the command line
if "%~1" NEQ "" (
        goto :direct_call
)

REM *** The check is necessary to distinguish between a new cmd.exe instance for a user or for a "FOR /F" sub-command
if "!_ccl_:~1,-2!" == "!comspec!" (
        REM ***** INTERACTIVE ****
        REM *** Show your skull or something else
)
exit /b