Что такое Windows-эквивалент "pidof" из Linux? - PullRequest
3 голосов
/ 14 ноября 2010

В пакетном сценарии мне нужно получить список идентификаторов процессов с заданным двоичным путем C:\path\to\binary.exe. В Linux я могу просто сделать pidof /path/to/binary.

Существует ли исполняемый файл Win32, который делает то же самое, поддерживается WinXP Home для Win7 (список задач не работает)?

Пакет, который включает это, должен быть переносимым, поэтому загрузка 10 МБ - это не то, что я ищу.

Имеется ли функция C, которая поддерживает и , поддерживаемую из WinXP в Win7? Примечание. Я хочу сопоставить путь процесса, а не имя файла, которое может использоваться другими приложениями.

Ответы [ 4 ]

4 голосов
/ 14 ноября 2010

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. Обратите внимание, что даже это не является полностью переносимым и не будет хорошо работать на x64, где вам понадобится QueryFullProcessImageName .

2 голосов
/ 14 ноября 2010

Вы можете использовать API-интерфейсы Toolhelp для перечисления процессов, получения их полного пути и сравнения с требуемым именем процесса.Вам нужно пройти список модулей для каждого процесса.Первый модуль в списке - это сам исполняемый файл процесса.Вот пример кода:

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 голос
/ 14 ноября 2010

Вы можете написать небольшое приложение на C #, которое сначала вызывает Process.GetProcessesByName (String) , затем просматривает результаты и печатает свойство Id каждого из них, когда используется MainModule. FileName равно пути, который вы ищете.

1 голос
/ 14 ноября 2010

PowerShell может решить ваши проблемы, если он встроен в Win 7 и доступен для загрузки в других ОС.

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

Этот сценарий получит один параметр, искомое имя файла и будетвыведите имя файла своего исполняемого файла.

Вы можете вызвать это из файла bat, выполнив:

powershell -Command "& {Get-Process | where -FilterScript {$ _. MainModule.FileName-eq% FILENAME%} "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...