为什么`cmd/k`和`cmd/c`记得已经完成的cmd子进程的历史记录?

npo*_*aka 4 windows cmd batch-file

这是我执行的命令:

>cmd /k
>echo 1
1

>echo 2
2

>echo 3
3

>exit /b

>cmd /c "doskey /history"
echo 1
echo 2
echo 3
exit /b

>
Run Code Online (Sandbox Code Playgroud)

(在Windows 7x64上测试)根据进程资源管理器cmd /k启动子进程(不是线程).因此,在退出流程之后,我会期望它会从记忆中清除他的东西.这件事发生在3/4/..产生的cmds上for /f,带有被调用的批处理文件.

sam*_*mdd 7

精简版:

控制台窗口处理命令历史记录

详细:

命令提示符窗口的过程如下:

conhost.exe
--- doskey.exe
------ cmd.exe
---------任何子进程(在你的情况下cmd /k)


Microsoft technet一样:

...如果退出然后从同一命令提示符窗口重新启动程序,则可以使用上一个程序会话中的命令历史记录.

您必须在启动程序之前运行Doskey.exe.即使程序具有shell命令,也无法从程序的命令提示符中使用doskey命令行选项.

Doskey在执行conhost.exe命令提示符窗口的进程下执行.这使它能够监视所有子进程和线程的击键.

从另一个进程中调用cmd时,根CMD进程会处理doskey历史记录


更新:

MC ND评论,在Windows XP/2003/Vista/2008中,命令历史记录由处理csrss.exe.从Windows 7开始,conhost.exe处理命令历史记录 - 更多信息

  • 仅供参考,对于Windows XP/2003/Vista/2008,命令历史记录由`csrss.exe`处理.从Windows 7`conhost.exe`处理此任务(更多[此处](http://www.rekall-forensic.com/docs/Manual/Plugins/Windows/CmdScan.html)). (4认同)
  • 不,它更复杂,请参阅[跨cmd实例的doskey历史行为](https://www.dostips.com/forum/viewtopic.php?f=3&t=7782).存储至少两个不同的列表 (3认同)