it-swarm.com.de

Wie erhält man die Prozess-ID anhand ihres Dienstnamens mit einem Skript in eine Variable?

Ich habe einen Dienst mit dem Namen WinDefend und er wird auf dem Prozess svchost.exe ausgeführt.
Es gibt viele andere svchost.exe-Prozesse, und ich muss einen Weg finden, um seine ID zu erhalten.
Wenn ich tasklist /svc starte, kann ich Folgendes sehen: enter image description here

Ich bin nicht sicher, wie ich es bekommen kann.
Ich habe diesen Befehl gefunden, aber als ich select "PID" ausprobierte, gab er mir eine leere Spalte .enter image description here

Ich muss die PID des Prozesses auf Variable setzen.

10
E235

tasklist gibt nur Text zurück, nicht tatsächliche Objekte mit Eigenschaften, auf die Sie zugreifen können. Sie können WMI verwenden, um diese Informationen stattdessen abzurufen:

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

$process = Get-Process -Id $id
16
Mike Zboray
$p=Tasklist /svc /fi "SERVICES eq windefend" /fo csv | convertfrom-csv
$p.PID
7
walid toumi

So ärgerlich es ist, müssen Sie einen eindeutigen Titel für Ihr Skript festlegen, wenn Sie die PID für den aktuellen Prozess verwenden möchten. Suchen Sie dann nach diesem eindeutigen Titel in der Liste der Prozesse. Dank des Befehls Titel können Sie genau das tun. Siehe auch MagicAndis Antwort ... 

Hier ist meine Batch-Datei-Lösung:

@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

Übrigens, ich hatte das "Vergnügen", dies über die Jahre immer wieder zu tun, über API, Batch oder PS. Wähle dein Gift aus - auf einer Windows-Plattform ist alles dasselbe.

Ich habe über Powershell einen noch besseren Weg gefunden: $ pid liefert die Prozess-ID des aktuellen Prozesses.

2
Mark Ronollo

Ich habe das verwendet und es funktioniert gut. YMMV

$ProcessName = "SomeProcessName"

$pidnumber = Get-Process -Name $ProcessName | Select -expand ID
1
user1649664
# 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

Vielen Dank,

0
Kambo

Ein alternativer Weg, um eine Prozess-PID zu erhalten:

$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]

Oder Sie können es zusammenfassen:

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

Hinweis: Dadurch wird der erste Dienst abgerufen, der mit Ihrem $serviceName übereinstimmt. Wenn Sie einen Dienst ausführen, der mehrere Instanzen von (e.x. slack) ausführt, erhalten Sie nur die erste PID. tasklist /v /fi "IMAGENAME eq slack.exe" /fo csv gibt ein Array zurück, wobei jede CSV-Zeile ein Array-Eintrag ist. Sie können dies auch mit findstr filtern, um zu vermeiden, dass die Spaltennamen angezeigt werden.

EDIT: Da WinDefend ein Subservice eines Programms ist (in diesem Fall svchost.exe), müssen Sie möglicherweise das ausführliche Flag für tasklist in /svc wie folgt austauschen:

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

suchen Sie alternativ nach dem Namen des Dienstes über einen Filter:

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

Berücksichtigen Sie dabei, dass der Filter eine Zeile mit Spaltennamen sowie die gesuchte Zeile zurückgibt:

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

Angenommen, Sie haben $serviceName in WinDefend statt svchost.exe geändert.

0
eFox