Tôi đã tìm thấy một giải pháp sử dụng các tệp văn bản để theo dõi tất cả các PID trước đó mà tệp bat đã có. Nó cố gắng giết chúng một cách im lặng và sau đó thêm PID hiện tại vào danh sách sau.
Nếu bạn không muốn nó giết quá trình cũ, đã có sẵn, chỉ cần thay thế dòng có "nhiệm vụ" bằng bất cứ điều gì bạn muốn làm với nó.
(có thể yêu cầu bạn chạy với tư cách quản trị viên để có quyền hủy quy trình trùng lặp. Xem mã độ cao quyền bên dưới để thực hiện tùy chọn nếu bạn không muốn phải chạy với tư cách quản trị viên mỗi lần.)
@echo off
set WorkingDir=%cd%
if exist MostRecentPID.txt ( del "PIDinfo.txt" /f /q ) > nul
cd ..\..\..\..\..\..\..
title mycmd
tasklist /v /fo csv | findstr /i "mycmd" > %WorkingDir%\PIDinfo.txt
set /p PIDinfo=<%WorkingDir%\PIDinfo.txt
REM below, the 11 means get substring starting a position 11 with length of 5 characters. The tasklist command gives a long and verbose value so this will get just the PID part of the string.
set PID5chars=%PIDinfo:~11,5%
set PID4chars=%PIDinfo:~11,4%
if exist PreviousPIDs.txt (
for /F "tokens=*" %%A in (PreviousPIDs.txt) do taskkill.exe /F /T /PID %%A > nul 2>&1
goto CheckIfFourCharPID
)
:CheckIfFourCharPID
if %PID4chars% gtr 8100 (
for /F "tokens=*" %%A in (PreviousPIDs.txt) do taskkill.exe /F /T /PID %%A > nul 2>&1
echo %PID4chars% >> "PreviousPIDs.txt"
) else (
echo %PID5chars% >> "PreviousPIDs.txt"
)
Giải thích: (cảnh báo: rất kỹ thuật)
Giải pháp này nhận được một chuỗi con của lệnh danh sách tác vụ để chỉ nhận PID. Sẽ không có một PID nào cho cmd.exe lớn hơn 18100, vì vậy hãy kiểm tra xem PID4chars có lớn hơn 8100 hay không để chúng tôi biết đó là số có 4 chữ số hay 5 chữ số
trường hợp 1: một PID gồm 5 chữ số như 17504 có giá trị PID5chars val 17504 và giá trị PID4chars là 1750, vì vậy chúng tôi thêm PID5chars vào các tệp văn bản của PID để tiêu diệt
trường hợp 2: một PID gồm 4 chữ số như 8205 có giá trị PID5chars là 8205 "và giá trị PID4chars là 8205, vì vậy chúng tôi thêm PID4chars vào các tệp văn bản của PID để tiêu diệt
trường hợp 3: một PID gồm 4 chữ số như 4352 có giá trị PID5chars là 4352 "và giá trị PID4chars là 4352, vì vậy chúng tôi thêm PID4chars vào các tệp văn bản của PID để tiêu diệt
MÃ SỐ TẠM DỪNG TÙY CHỌN
(đặt cái này ở đầu tập tin bat của bạn và nó sẽ tự động chạy nó với tư cách quản trị viên.)
@echo off
setlocal DisableDelayedExpansion
set "batchPath=%~0"
for %%k in (%0) do set batchName=%%~nk
cd ..\..\..\..\..\..\..\..
if exist %cd%\Temp (
set temp=%cd%\Temp
goto vbsGetPrivileges
)
if exist %cd%\Windows\Temp (
set temp=%cd%\Windows\Temp
goto vbsGetPrivileges
)
set temp=%cd%
:vbsGetPrivileges
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion
:CheckIfRunningAsAdmin
net session >nul 2>&1
if %ERRORLEVEL% == 0 (
goto gotPrivileges
) else ( goto ElevatePermissions )
:ElevatePermissions
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
ECHO args = "ELEV " >> "%vbsGetPrivileges%"
ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg ^& " " >> "%vbsGetPrivileges%"
ECHO Next >> "%vbsGetPrivileges%"
ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
"%SystemRoot%\System32\WScript.exe" "%vbsGetPrivileges%" %*
exit /B
:gotPrivileges
setlocal & pushd .
cd /d %~dp0
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul & shift /1)
net session >nul 2>&1
if %ERRORLEVEL% == 0 (
goto Continue
) else (
REM unable to elevate permissions so tell user to run file as admin manually
echo Please re-run this file as administrator. Press any key to exit...
pause > nul
goto Exit
)
:Continue
<insert rest of code here>