代码之家  ›  专栏  ›  技术社区  ›  Lekensteyn

Windows与Linux中的“pidof”是什么等价物?

  •  3
  • Lekensteyn  · 技术社区  · 14 年前

    在批处理脚本中,我需要获取具有给定二进制路径的进程ID列表 C:\path\to\binary.exe . 在Linux中,我可以 pidof /path/to/binary .

    winxp home到win7是否有相同的win32可执行文件(tasklist不起作用)?

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

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

    4 回复  |  直到 12 年前
        1
  •  2
  •   swatkat    14 年前

    您可以使用工具帮助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
  •  4
  •   kichik    12 年前

    wmic.exe在xp、vista和7上可用,可以做到这一点。但是,它不随Windows XP家庭版一起提供。

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

    如果您也希望支持Windows XP Home,可以使用 EnumProcess GetModuleFileNameEx . 缺点是,如果您不是以管理员身份运行,则无法查询其他用户运行的进程的名称。 QueryFullProcessImageName 可能会在这里完成,但它是Vista+。

    如果这还不够,你就需要 Process32First (斯瓦特的代码)。对于您需要调用的每个进程 Module32First 然后得到 MODULEENTRY32->szExePath . 请注意,即使这不是完全可移植的,在您需要的X64上也不能很好地工作。 查询完整进程图像名称 .

        3
  •  1
  •   rkellerm    14 年前

    您可以编写一个小的C应用程序,它首先调用 Process.GetProcessesByName(String) ,然后检查结果并打印 Id 当主模块时,每个属性的属性。 FileName 等于您要查找的路径。

        4
  •  1
  •   David Reis    14 年前

    PowerShell可以解决您的问题,如果它内置在Win7中,并且可以在其他OSS上下载。

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

    此脚本将接收一个参数,即您要查找的文件名,并将输出其可执行文件的文件名。

    您可以通过执行以下操作从BAT文件调用此命令:

    powershell-命令“&get process其中-filterscript$.mainmodule.filename-eq%filename%”