2017-03-29 8 views
4

Here're私が実行してきたコマンド:なぜ `cmd/k`と` cmd/c`はすでに終了したcmdサブプロセスの履歴を覚えていますか?

>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 

> 

(Windows上でテストしたが、7x64)プロセスエクスプローラカントーよるcmd /kは、サブプロセス(スレッドではない)を開始します。プロセスが終了した後、私はそれがメモリから彼のものをクリアすることを期待するだろう。このことは、バッチファイルと呼ばれる、3/4/.. spawned cmds、for /fで起こります。

+0

ショートバージョン:コンソールウィンドウであり、コマンドシェルではなく、ここで作業しています。 –

+1

窓XP/2003/Vistaの/ 2008年、ちょうどについては – jeb

答えて

7

ショートバージョン:

コンソールウィンドウハンドル

詳細なコマンド履歴次のようにコマンドプロンプトウィンドウの

プロセスがある:

conhost.exe
--- doskey.exe
------ cmd.exeの
---------(あなたの場合cmd /k)任意のサブプロセス


としてMicrosoft technet:

に...あなたが終了して、プログラムを再起動した場合同じコマンドプロンプトウィンドウから、は、前のプログラムセッションのコマンド履歴が利用可能です。

あなたがプログラムを開始する前に、Doskey.exeを実行する必要があります。プログラムにシェルコマンドがあっても、プログラムのコマンドプロンプトからdoskeyコマンドラインオプションを使用することはできません。

Doskeyは、コマンドプロンプトウィンドウを表示するプロセスconhost.exeで実行されます。これにより、すべてのサブプロセスとスレッドのキーストロークを監視できます。

あなたが別のプロセス内からcmdを呼び出すと、ルートCMDプロセスはDOSKEY履歴を扱う


更新:

/WindowsのXP/2003/Vistaで、MC NDでコメントしたよう2008年のコマンド履歴はcsrss.exeによって処理されます。 Windows 7以降では、conhost.exeがコマンド履歴を処理します。 - more here

+4

(https://www.dostips.com/forum/viewtopic.php?f=3&t=7782)も[CMDインスタンス間DOSKEY履歴行動]を参照してくださいコマンド履歴は 'csrss.exe'によって処理されます。 Windows 7から、このタスクを処理する 'conhost.exe'(more [here](http://www.rekall-forensic.com/docs/Manual/Plugins/Windows/CmdScan.html))。 –

+1

しかし、 'dos.exe.exe 'の直下の最初の' cmd.exe'の歴史は変わっていないのはなぜですか?しかし、新しい 'cmd'をもう一度開くと、入力されたすべてのコマンドの_full_リストが表示されます – jeb

+3

いいえ、もっと複雑です。[cmdインスタンス全体のdoskey履歴の動作](https://www.dostips.com/forum/viewtopic .php?f = 3&t = 7782)。少なくとも2つの異なるリストが格納されている – jeb

関連する問題