source

변수에 대한 스크립트를 사용하여 프로세스 ID를 서비스 이름으로 가져오는 방법

manycodes 2023. 8. 14. 22:58
반응형

변수에 대한 스크립트를 사용하여 프로세스 ID를 서비스 이름으로 가져오는 방법

이름이 지정된 서비스가 있습니다.WinDefend프로세스에 따라 실행됩니다.svchost.exe
다른 많은 것들이 있습니다.svchost.exe프로세스와 ID를 확인할 방법을 찾아야 합니다.
달리면tasklist /svc볼 수 있습니다.enter image description here

제가 그것을 어떻게 받을 수 있을지 잘 모르겠습니다.
이 명령을 찾았지만 시도해보니select "PID"그것은 나에게 빈 칸을 주었습니다.enter image description here

저는 공정의 PID를 변수로 만들어야 합니다.

tasklist는 텍스트만 반환하고 액세스할 수 있는 속성을 가진 실제 개체는 반환하지 않습니다.대신 WMI를 사용하여 이 정보를 가져올 수 있습니다.

$id = Get-WmiObject -Class Win32_Service -Filter "Name LIKE 'WinDefend'" | 
      Select-Object -ExpandProperty ProcessId

$process = Get-Process -Id $id

PowerShell Core 업데이트

버전 6에서 윈도우즈 PowerShell은 에 기반한 PowerShell Core를 통해 플랫폼 간 지원을 시작했습니다.NET 코어.이로 인해 윈도우즈 중심의 cmdlet이 많이 변경되었으며 일부는 완전히 제외되었습니다.WMI는 윈도우즈 전용 기술이므로 해당 cmdlet(예: Get-WmiObject)은 포팅되지 않았습니다.그러나 이 기능은 CIM cmdlet(예: Get-CimInstance)을 통해 사용할 수 있습니다. 여기 PowerShell 6+에서 작동하는 버전이 있습니다.

$id = Get-CimInstance -Class Win32_Service -Filter "Name LIKE 'WinDefend'" | 
      Select-Object -ExpandProperty ProcessId

$process = Get-Process -Id $id
$p=Tasklist /svc /fi "SERVICES eq windefend" /fo csv | convertfrom-csv
$p.PID

번거롭지만 현재 프로세스에 대한 pid를 원하는 경우 스크립트에 대한 고유한 제목을 설정해야 합니다.그런 다음 프로세스 목록에서 고유한 제목을 검색합니다.고맙게도 제목 명령을 사용하면 이 작업을 수행할 수 있습니다.MagicAndi의 반응도 확인할 수 있습니다.

내 배치 파일 솔루션은 다음과 같습니다.

@ECHO OFF
:SetVars
    SET _Thread=%1
    title=ExecBatch_%_Thread%
    Set /A "_iPID=0"
:Main
    CALL :getPID _iPID %_Thread%
    ...
EXIT /b

::----------------
::---- GetPID ---- 
::----------------
:getPID 
    setlocal   
        set _getPIDcmd=tasklist /v /fo csv 
        for /f "tokens=2 delims=," %%i in ('%_getPIDcmd% ^| findstr /i "ExecBatch_%2"') do (
            echo %%~i
            set _pid=%%~i
        )
    endlocal & Set %~1=%_pid%
exit /b

그나저나, 저는 수년간 API, 또는 배치 또는 ps를 통해 이 일을 반복하는 '기쁨'을 느껴왔습니다.독약을 선택하세요 - Windows 플랫폼에서는 모두 동일합니다.

powershell을 통해 더 나은 방법을 찾았습니다. $pid는 현재 프로세스의 프로세스 ID를 반환합니다.

# Enter servicename. (instead of 'netman')
$service = Get-CimInstance -class win32_service | Where-Object name -eq 'netman' | select name, processid
$process = Get-Process | Where-Object ID -EQ $service.processid
Clear-Host
Write-Host '********* ServiceName, PID and ProcessName ******'
Write-Host 'ServiceName:' $service.name 
Write-Host 'ID:' $process.Id 
Write-Host 'ProcessName:' $process.Name

감사해요.

프로세스 PID를 가져오는 다른 방법:

$serviceName = 'svchost.exe'
$pidArgumentPlacement = 1

# Call for the verbose version of tasklist and filter it for the line with your service's name. 
$serviceAsCSVString = tasklist /v /fo csv | findstr /i $serviceName

# Remove the quotes from the CSV string
$serviceCSVStringWithoutQuotes = $serviceAsCSVString -replace '["]'
# Turn the string into an array by cutting at the comma
$serviceAsArray = $serviceCSVStringWithoutQuotes -split ","
# Get the pid from the array
$servicePID = $serviceAsArray[$pidArgumentPlacement]

또는 다음과 같이 요약할 수 있습니다.

$servicePID = $($($(tasklist /v /fo csv | findstr /i $serviceName) -replace '["]') -split ",")[$pidArgumentPlacement]

참고: 이렇게 하면 고객과 일치하는 첫 번째 서비스를 얻을 수 있습니다.$serviceName여러 인스턴스(예: 슬랙)를 실행하는 서비스를 실행하면 첫 번째 pid만 얻을 수 있습니다.tasklist /v /fi "IMAGENAME eq slack.exe" /fo csv각 CSV 줄이 배열 항목인 배열을 반환합니다.다음을 사용하여 필터링할 수도 있습니다.findstr열 이름을 가져오지 않도록 합니다.

편집: WinDefend는 프로그램의 하위 서비스입니다(이 경우).svchost.exe) 다음에 대한 자세한 플래그를 교체해야 할 수 있습니다.tasklist로./svc이와 같이:

$serviceAsCSVString = tasklist /svc /fo csv | findstr /i $serviceName

또는 필터를 통해 서비스 이름을 검색합니다.

$serviceAsCSVString = tasklist /svc /fi "SERVICES eq $serviceName" /fo csv | findstr /i $serviceName

그리고 필터가 열 이름 행과 찾으려는 행을 반환한다는 점을 고려합니다.

$serviceCSVStringWithoutQuotes = $serviceAsCSVString[1] -replace '["]'

변했다고 하면,$serviceNameWinDefendsvchost.exe.

Get-Process -Id ((Get-WmiObject -Class Win32_Service -Filter "Name -eq 'WinDefend'").ProcessId)

대답은 간단하다.(get -wmiobject -get "select * from win32_service" 여기서 name='sevicename'."processid).우선 순위 클래스="우선 순위"

이 명령을 수행하면 지정된 서비스가 svchost에 있더라도 설정됩니다.

편집됨: PID만 찾고 있습니다. 우선순위 설정을 제외하고 동일한 명령을 수행하십시오.우선순위를 정하는 데 쓰실 거라고 생각했는데 히히.

저는 이것을 사용했고 잘 작동합니다. YMMV.

$ProcessName = "SomeProcessName"

$pidnumber = Get-Process -Name $ProcessName | Select -expand ID

언급URL : https://stackoverflow.com/questions/26331183/how-to-get-process-id-by-its-service-name-with-a-script-to-variable

반응형