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?