私のプログラムの1つは、デバッグ目的でスレッドIDを出力します。テスト上の理由から、スレッドIDが属するプロセスを強制終了したいと思います。
スレッドIDを持っている場合、taskkill
で使用できるようにプロセスIDを取得するにはどうすればよいですか?
私は試した
tasklist
ですが、広告IDのスイッチがないようです。-a Thread
、しかしそれはうまくいかないようです。 handle -a | find "Thread"
うまく機能しますが、プロセス情報が失われますあなたはバッチファイルでこのようにそれをすることができます:
バッチファイルkillprocess.bat:
@echo off
set processhandle=
set description=
set handle=%1
IF "%handle%." == "." (
echo Usage: killprocess threadID
exit/b
)
FOR /F "tokens=*" %%A IN ('WMIC PATH Win32_thread WHERE handle^=%handle% GET Processhandle /VALUE ^| find "="') DO set "%%A"
FOR /F "tokens=*" %%A IN ('WMIC PATH Win32_process WHERE handle^=%processhandle% GET Description /VALUE ^| find "="') DO set "%%A"
IF "%ProcessHandle%." == "." (
echo ThreadID not found
exit/b
)
echo I'm going to kill %Description% (Processhandle = %processhandle%) if you don't press Q in 5 seconds
echo (or you can press Y to continue)
choice /N /T 5 /C yq /D y
if "%errorlevel%"=="2" goto :eof
echo Killing %Description% (Processhandle = %processhandle%)
Taskkill /PID %processhandle% /T /F
使用法は次のようになります。killprocess 13008
編集:中止オプション(選択)と強制終了されるプロセスの説明も追加しました。不要な場合は削除できます。
これが私のC++ソリューションです。誰かがそれを使用したい場合に備えて、私はそれをCC0 /パブリックドメインとしてライセンスします。私はめったにC++で実装しないので、間違いを許してください。
#include "stdafx.h"
#include <sstream>
#include <windows.h>
#include <stdio.h>
#include <iostream>
int main(int argc, char* argv[])
{
if (argc < 2)
{
std::cout << "Usage: " << argv[0] << " <Thread ID>" << std::endl;
std::cout << "Returns the process ID of a thread." << std::endl;
std::cout << "Errorlevels:" << std::endl;
std::cout << " 0 success" << std::endl;
std::cout << " 1 too few arguments" << std::endl;
std::cout << " 2 error parsing thread ID" << std::endl;
std::cout << " 3 error opening thread" << std::endl;
return 1;
}
std::istringstream iss(argv[1]);
int threadId;
if (iss >> threadId)
{
std::cout << threadId << std::endl;
HANDLE threadHandle = OpenThread(THREAD_QUERY_INFORMATION, false, (DWORD)threadId);
if (threadHandle)
{
DWORD pid = GetProcessIdOfThread(threadHandle);
CloseHandle(threadHandle);
std::cout << pid << std::endl;
return 0;
}
std::cerr << "Error opening thread. Perhaps run as admin or thread does not exist?";
return 3;
}
std::cerr << "Error parsing thread ID. Use decimal, not hex?";
return 2;
}