在批处理脚本中,我需要获取具有给定二进制路径C:\path\to\binary.exe
的进程ID列表。
在Linux中,我可以pidof /path/to/binary
。
是否有Win32可执行文件执行相同操作,从WinXP Home到Win7支持(任务列表不起作用)?
包含它的软件包必须是便携式的,所以10MB下载不是我想要的。
是否有可用的C函数从WinXP到Win7支持和?注意:我想匹配一个进程路径,而不是其他应用程序也可以使用的文件名。
答案 0 :(得分:4)
wmic.exe在XP,Vista和7上可用,并且可以执行此操作。但是,它不附带Windows XP Home Edition。
wmic process where ExecutablePath='C:\\windows\\system32\\notepad.exe' get ProcessId
如果您也想要支持Windows XP Home,可以使用EnumProcess和GetModuleFileNameEx。这里的缺点是,如果您没有以管理员身份运行,您将无法查询由其他用户运行的进程的名称。 QueryFullProcessImageName可能会在这里发挥作用,但它是Vista +。
如果这还不够,你需要Process32First(swatkat的代码)。对于每个流程,您需要致电Module32First,然后获取MODULEENTRY32->szExePath
。请注意,即使这样也不是完全可移植的,并且在您需要QueryFullProcessImageName的x64上无效。
答案 1 :(得分:2)
您可以使用Toolhelp API枚举进程,获取其完整路径并将其与所需的进程名称进行比较。您需要遍历每个进程的模块列表。列表中的第一个模块是进程可执行文件本身。这是一个示例代码:
int main( int argc, char* argv[] )
{
if( argc > 1 )
{
printf( "\nGetting PID of: %s\n", argv[1] );
HANDLE hProcSnapshot = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if( INVALID_HANDLE_VALUE != hProcSnapshot )
{
PROCESSENTRY32 procEntry = {0};
procEntry.dwSize = sizeof(PROCESSENTRY32);
if( ::Process32First( hProcSnapshot, &procEntry ) )
{
do
{
HANDLE hModSnapshot = ::CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, procEntry.th32ProcessID );
if( INVALID_HANDLE_VALUE != hModSnapshot )
{
MODULEENTRY32 modEntry = {0};
modEntry.dwSize = sizeof( MODULEENTRY32 );
if( Module32First( hModSnapshot, &modEntry ) )
{
if( 0 == stricmp( argv[1], modEntry.szExePath ) )
{
printf( "\nPID: %ld\n", procEntry.th32ProcessID );
::CloseHandle( hModSnapshot );
break;
}
}
::CloseHandle( hModSnapshot );
}
}
while( ::Process32Next( hProcSnapshot, &procEntry ) );
}
::CloseHandle( hProcSnapshot );
}
}
return 0;
}
答案 2 :(得分:1)
PowerShell可以解决您的问题,如果在Win 7中可以使用,也可以在其他操作系统上下载。
param($fileName)
Get-Process | where -FilterScript {$_.MainModule.FileName -eq $fileName}
此脚本将接收一个参数,即您要查找的文件名,并将输出其可执行文件的文件名。
您可以通过执行以下操作从bat文件中调用此方法:
powershell -Command“& {Get-Process | where -FilterScript {$ _。MainModule.FileName -eq%FILENAME%}”
答案 3 :(得分:1)
您可以编写一个小型C#应用程序,首先调用Process.GetProcessesByName(String),然后检查结果并在MainModule。Id等于路径时打印每个属性的FileName属性。你在寻找。