批处理文件重新加载自动运行缓冲区
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>
在我的例子中,我调用了一个批处理文件,除其他外,它给出了几个在屏幕上显示这个头骨的回声。
- 但问题是,为什么它的行为就像在后台重新加载自动运行一样
当我已经打开命令提示符时?
- 它为什么离开
缓冲区中的所有内容,以便
%%s
将其再次拉到(页面代码活动)':'?
- 为什么
你在
%%t
上给了很多 ECHO is off
之后唯一的事情
代码页活动:是一个数字?
- 最重要的是:我如何解决它?
很明显,你已经指出了问题。
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
为了让生活更轻松,有些事情我们宁愿不去理解。 但这不是我可以选择的...
我制作了一个批处理文件(或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>
在我的例子中,我调用了一个批处理文件,除其他外,它给出了几个在屏幕上显示这个头骨的回声。
- 但问题是,为什么它的行为就像在后台重新加载自动运行一样 当我已经打开命令提示符时?
- 它为什么离开
缓冲区中的所有内容,以便
%%s
将其再次拉到(页面代码活动)':'? - 为什么
你在
%%t
上给了很多ECHO is off
之后唯一的事情 代码页活动:是一个数字? - 最重要的是:我如何解决它?
很明显,你已经指出了问题。
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