15

私が質問する理由は、私のプログラムがサード パーティのソフトウェアを使用しており、そのソフトウェアが、自分のプログラムまたはサード パーティのプロセスにリンクされていない孤立したプロセスを残すことがあるからです。これらの孤立したプロセスは、時間の経過とともに追加され、大量のリソースを消費し始めます。定期的にそれらを殺したいのですが、それを行うには、それらが他のプログラムではなく私のプログラムによって作成されたことを確認する必要があります。Process Explorer で孤立したプロセスを表示しました。プロセスのプロパティを見ると、「現在のディレクトリ」というフィールドが表示されます。孤立したプロセスの現在のディレクトリは、プログラムのインストール ディレクトリです。これにより、プログラムによって作成されたプロセスを強制終了しているという安心感が得られます。

これらのプロセスはサードパーティによって作成されているため、タスクキルなどを実行して作成した後、それらを強制終了する必要があります。バッチ ファイルですぐに使用できる Windows コマンドを使用して、プロセスの現在の作業ディレクトリを把握する方法はありますか? これが望ましい wmic クエリで実行できる場合は、wmic を使用しているときに現在の作業ディレクトリを見つけることができないようです。Process Explorer がこの情報を取得できれば、バッチ コマンドを使用して取得できるはずです。

4

3 に答える 3

13

Handleは、システム内の任意のプロセスの開いているハンドルに関する情報を表示するユーティリティです。これを使用して、ファイルを開いているプログラムを表示したり、プログラムのすべてのハンドルのオブジェクト タイプと名前を表示したりできます。

その GUI ベースのバージョンはProcess Explorerです。

handle -p yourProcess.exe  > log.txt

ログ ファイルに yourProcess.exe のすべてのハンドルが一覧表示され、バッチ コマンドを使用して、log.txt から yourProcess の「現在の作業ディレクトリ」を簡単に抽出できるようになりました。

バーロップによって追加されました

出力は次のとおりです。プロセス c:\tinyweb\tiny.exe は、c:\tinyweb\rrr から実行されます。

C:\Users\user>handle -p tiny.exe

Nthandle v4.1 - Handle viewer
Copyright (C) 1997-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

------------------------------------------------------------------------------
tiny.exe pid: 20668 compA\user
   10: File          C:\Windows
   1C: File          C:\tinyweb\rrr
   9C: File          C:\tinyweb\rrr\access_log
   A0: File          C:\tinyweb\rrr\agent_log
   A4: File          C:\tinyweb\rrr\error_log
   A8: File          C:\tinyweb\rrr\referer_log
   E4: Section       \Sessions\1\BaseNamedObjects\__wmhr_msgs_buffer_name$1e74
   EC: File          C:\Windows\winsxs\x86_microsoft.windows.common-controls_659

C:\Users\user>

具体的に解析したい場合は、純粋な cmd.exe で /f などを使用するか、Ruby などのサードパーティのスクリプト言語を使用するか、さまざまな *nix スタイルのコマンド ライン ツールの Windows ポートを使用して実行できます。この行はそのようなツールを使用して取得します(明らかに、次の行にはgrepとsedが必要です。できれば、cygwinなどの適切なバージョンが必要です)

C:\Users\harvey>handle -p tiny.exe | grep "pid:" -A 3 | sed -n "3p" | grep -o ".:[\]\S*"
C:\tinyweb\rrr
于 2013-12-15T08:15:11.907 に答える
13

WDKからレスキューまでtlist ! その出力の 2 行目 ("CWD: ...") は、プロセスの作業ディレクトリを示しています。

> tlist 944
 944 postgres.exe
   CWD:     D:\Lab\Database\pgsql\test\
   CmdLine: "D:/Tools/pgsql/bin/postgres.exe"  -D "."
   VirtualSize:   221116 KB   PeakVirtualSize:   242620 KB
   WorkingSetSize: 17076 KB   PeakWorkingSetSize: 19336 KB
   NumberOfThreads: 4
   9084 Win32StartAddr:0x00000000 LastErr:0x00000000 State:Waiting
   8504 Win32StartAddr:0x00000000 LastErr:0x000000b7 State:Waiting
   8616 Win32StartAddr:0x00000000 LastErr:0x00000000 State:Waiting
   7468 Win32StartAddr:0x00000000 LastErr:0x00000000 State:Waiting
    9.3.5.14202 shp  0x0000000000400000  D:\Tools\pgsql\bin\postgres.exe
 6.1.7601.18247 shp  0x00000000770D0000  C:\Windows\SYSTEM32\ntdll.dll
 ...

詳細については、ドキュメントを参照してください。

于 2014-09-15T17:01:09.583 に答える
-1

CommandLine以下は機能しますが、" "または" "のみが必要であり、ExecutablePath両方ではありません。

wmic process where "ProcessID=1111" get CommandLine, ExecutablePath

次のようなものが返され、PID 1111 のプログラムが実行されている場所が示されます。

"C:\Program Files (x86)\Common Files\MyProgram\Agent\agent.exe"
于 2014-09-09T16:03:54.920 に答える