什么是Windows的“pidof”从Linux相当于什么?

在批处理脚本中,我需要获取给定二进制pathC:\path\to\binary.exe的进程ID列表。 在Linux中,我只能做pidof /path/to/binary

是否有一个Win32可执行文件相同,从WinXP主页到Win7的支持(任务列表不起作用)?

包含这个的软件包必须是可移植的,所以10MB的下载并不是我想要的。

有没有一个C函数可以做到这一点是从WinXP支持Win7的? 注意:我想匹配一个进程path,而不是其他应用程序可以使用的文件名。

您可以使用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( modulee32First( 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; } 

wmic.exe在XP,Vista和7上可用,可以做到这一点。 但是,它不包含在Windows XP Home Edition中。

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

如果您还想要支持Windows XP Home,则可以使用EnumProcess和GetmoduleeFileNameEx 。 这里的缺点是,如果你没有以管理员身份运行,你将无法查询其他用户正在运行的进程的名字。 QueryFullProcessImageName可能会在这里做的伎俩,但它是Vista +。

如果这还不够,你需要Process32First (swatkat的代码)。 对于每个进程,您需要调用modulee32First ,然后获取MODULEENTRY32->szExePath 。 请注意,即使这不是完全可移植的,并且在需要QueryFullProcessImageName的 x64上将无法正常工作。

您可以编写一个首先调用Process.GetProcessesByName(String)的小型C#应用程序,然后查看结果并在Mainmodulee中打印每个的Id属性。 FileName等于您正在查找的路径。

PowerShell可以解决你的问题,如果是在Win 7中建立,并可以在其他操作系统上下载。

 param($fileName) Get-Process | where -FilterScript {$_.Mainmodulee.FileName -eq $fileName} 

这个脚本将接收一个参数,你正在寻找的文件名,它将输出其可执行文件的文件名。

你可以通过做一个bat文件来调用它:

powershell -Command“&{Get-Process | where -FilterScript {$ _。Mainmodulee.FileName -eq%FILENAME%}”