Linux 中的“pidof”在 Windows 中相当于什么?

问题描述 投票:0回答:5

在批处理脚本中,我需要获取具有给定二进制路径的进程 ID 列表

C:\path\to\binary.exe
。 在 Linux 中,我可以这样做
pidof /path/to/binary

是否有具有相同功能的 Win32 可执行文件,支持从 WinXP Home 到 Win7(任务列表不起作用)?

包含此内容的软件包必须是可移植的,因此 10MB 的下载不是我想要的。

是否有可用的 C 函数可以做到这一点并且从 WinXP 到 Win7 都受支持?注意:我想匹配进程路径,而不是其他应用程序也可以使用的文件名。

c windows batch-file
5个回答
5
投票
wmic.exe 可在 XP、Vista 和 7 上使用,并且可以执行此操作。但是,Windows XP 家庭版不附带它。

wmic process where ExecutablePath='C:\\windows\\system32\\notepad.exe' get ProcessId

如果您也想支持 Windows XP Home,可以使用

EnumProcessGetModuleFileNameEx。这里的缺点是,如果您不以管理员身份运行,您将无法查询其他用户运行的进程的名称。 QueryFullProcessImageName 可能可以解决这个问题,但它是 Vista+。

如果这还不够,您需要

Process32First(swatkat 的代码)。对于每个进程,您需要调用Module32First,然后获取MODULEENTRY32->szExePath

。请注意,即使这也不是完全可移植的,并且在 x64 上也无法正常工作,您需要 
QueryFullProcessImageName


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; }
    

1
投票
您可以编写一个小型 C# 应用程序,它首先调用

Process.GetProcessesByName(String) ,然后检查结果并在 MainModule.FileName 等于您正在查找的路径时打印每个结果的 Id 属性为.


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%}"


0
投票
我使用

pidof

 并以进程名称作为参数。我以前不需要可执行路径。我这样使用它:

pidof php
它只是返回正在运行的进程的PID。与 PowerShell 类似,我可以按如下方式使用它:

(get-process php).id
它会像 

pidof

 一样返回 PID。

© www.soinside.com 2019 - 2024. All rights reserved.