Daha önce başlatılan toplu komut dosyasını tanımlayın ve öldürün


0

Toplu komut dosyası işleme ile ilgili yardıma ihtiyacım var, araç üstü araçlarla tekrar çalışmak, hiçbir ek donanım yüklenemez.

Çalışan işlemler hakkında bilgi toplayan bir CMD.exe betiğim var (tasklist.exe aracılığıyla) ve bunları bir dosyaya bağlar, her satırda bir zaman damgası tarafından önceden. Bu dosya daha sonra bellek ya da bazı eşiğin üzerinde cputime kullanan tüm işlemler için bazı süslü grafikler oluşturmak için kullanılır.

Fakat sorun şu ki, bu betiği en çok çalışmadan hemen önce ortamımdan başlatmam gerekiyor ve test bittikten sonra durdurmam gerekiyor. Başlat ve durdur tek bir işlemde değildir ve çok uzun sürebilir (dakikadan birkaç saate kadar).

Ben zaten kullanmaya çalıştım TITLE Daha sonra çalışan betiği tanımlayabilmek, öldürmek TASKKILL /F /FI "WINDOWTITLE EQ PSMON" ancak bu işe yaramazsa, senaryo başlangıç ​​durumuna getirilmemişse, windowtitle ayarlanmamış gibi görünüyor.

İlgilenenler için, işte senaryo:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
TITLE=PSMON

:START
SET FILE=%TEMP%\psmon.csv
ECHO TIMESTAMP^;IMAGENAME^;PID^;MEMKB^;CPUTIME>%FILE%

:LOOP
TITLE=PSMON
SET TS=%TIME%
SET SEK=%TS:~7,1%
IF %SEK% == 0 (
    FOR /F "tokens=1-12 delims=,:" %%A IN ('TASKLIST /V /NH /FO CSV') DO (
    SET IMAGE=%%A
    SET PID=%%B
    SET MEM=%%E
    SET CPUH=%%H
    SET CPUM=%%I
    SET CPUS=%%J
    SET /A CPU=!CPUH!*3600 + !CPUM!*60 + !CPUS!
    IF !CPU! GTR 100 (
        ECHO %DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%%TS:~0,2%%TS:~3,2%%TS:~6,2%^;!IMAGE:~1,-1!^;!PID:~1,-1!^;!MEM:~1,-3!^;!CPU!>>%FILE%
        )
    )
)
GOTO LOOP

Ve açık olmak gerekirse, soru, bunun örneğini penceredeki araç araçlarıyla nasıl tanımlayabilirim ve eğer doğrudan cmdline üzerinde başlatılmadıysa ya da çift tıklamayı kullanmadan işlemi nasıl öldürebilirim (ikinci bir toplu işlemden başlamayı deneyin start komutunu kullanarak .cmd dosyası).

PID'yi betiğin başında başlatmak ve geçici bir dosyaya yazmak veya bunun gibi bir unix sistemde yapılması gibi bir şey istiyorum, ancak bunun gibi bir şey olduğundan şüpheliyim.

DÜZENLE: Bunun gibi bir sürü kod satırına ima ettim:

for /f "usebackq tokens=2" %%a in (`tasklist /FO list /FI "SESSIONNAME eq %SESSIONNAME%" /FI "USERNAME eq %USERNAME%" /FI "WINDOWTITLE eq %instance%" ^| find /i "PID:"`) do set PID=%%a
if not defined PID for /f "usebackq tokens=2" %%a in (`tasklist /FO list /FI "SESSIONNAME eq %SESSIONNAME%" /FI "USERNAME eq %USERNAME%" /FI "WINDOWTITLE eq Administrator:  %instance%" ^| find /i "PID:"`) do set PID=%%a
if not defined PID echo !Error: Could not determine the Process ID of the current script.  Exiting.& exit /b 1

Ne yazık ki onlar sadece işe yaramazsa, komut dosyası her zaman tanımlanan hata mesajı ile durur. Belki de Win7 üzerinde çalıştığımı söylemeliyim?



Teşekkürler David, ama bu işe yaramıyor.
Oliver Friedrich

Tüm önerileri denedin mi?
DavidPostill

1
Evet, özür dilerim üstesinden gelmek biraz zor. İkinci öneri işe yarıyor, ama hoş olmamasına rağmen ... ama buna gerek yok. Teşekkür ederim.
Oliver Friedrich

Yanıtlar:


1

Tamam, teşekkürler DavidPostill ve bu bağlantı Current cmd.exe dosyasının PID'si nedir , PID'i yerleşik araçlarla almak için gerçekten çalışan bir yol var.

SET T=%TEMP%\sthUnique.tmp
wmic process where (Name="WMIC.exe" AND CommandLine LIKE "%%%TIME%%%") get ParentProcessId /value | find "ParentProcessId" >%T%
SET /P PID=<%T%
ECHO %PID:~16%>%TEMP%\my.pid

Bununla daha sonra görevi öldüreceğim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.