Batch verbraucht zu viel RAM
Hallo zusammen,
ich habe folgendes Problem mit diesem BatchScript:
Dieses soll die laufenden cmd Prozesse (außer den eigenen) finden und in eine Datei schreiben.
Dies funktioniert tadellos. Leider verbraucht das Script zu viel RAM (20-40% bei mir)
Könnte man das Script dazubringen, weniger RAM zu verspeisen?
Ein höhrerer Ping würde das Script zu sehr stoppen, es soll nämlich gestartete cmd-Prozesse schnellstmöglich weiterverarbeiten.
Vielen Dank für eure Mühe im Vorraus,
Alme123
ich habe folgendes Problem mit diesem BatchScript:
@echo off
title Batch
:start
ping localhost -n 1 >nul
tasklist /v | findstr /c:"cmd.exe" | findstr /v /c:"Batch" >"%temp%\allcmds.tmp"
if errorlevel 1 goto start
:: Weiterer unwichtiger Code...
Dieses soll die laufenden cmd Prozesse (außer den eigenen) finden und in eine Datei schreiben.
Dies funktioniert tadellos. Leider verbraucht das Script zu viel RAM (20-40% bei mir)
Könnte man das Script dazubringen, weniger RAM zu verspeisen?
Ein höhrerer Ping würde das Script zu sehr stoppen, es soll nämlich gestartete cmd-Prozesse schnellstmöglich weiterverarbeiten.
Vielen Dank für eure Mühe im Vorraus,
Alme123
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 206328
Url: https://administrator.de/forum/batch-verbraucht-zu-viel-ram-206328.html
Ausgedruckt am: 25.12.2024 um 01:12 Uhr
11 Kommentare
Neuester Kommentar
Hallo Alme123,
in deinem anderen Thread wird WMIC dazu benutzt um von der PID der cmd.exe auf den Speicherort der Batchdatei zu schließen. Welchen Sinn macht dann eigentlich deine allcmds.tmp? Ist es nicht sinnvoller alles mit WMIC in einem Rutsch abzuwickeln?
Grüße
rubberman
in deinem anderen Thread wird WMIC dazu benutzt um von der PID der cmd.exe auf den Speicherort der Batchdatei zu schließen. Welchen Sinn macht dann eigentlich deine allcmds.tmp? Ist es nicht sinnvoller alles mit WMIC in einem Rutsch abzuwickeln?
Grüße
rubberman
Hallo Alme123,
mein Ansatz sähe etwa so aus:
Grüße
rubberman
mein Ansatz sähe etwa so aus:
@echo off &setlocal
REM Eigene PID finden, um später diesen und die Tochterprozesse (WMIC) auszufiltern
setlocal EnableDelayedExpansion
set "uid="
for /l %%i in (1 1 128) do (set /a "bit=!random!&1" &set "uid=!uid!!bit!")
for /f "tokens=2 delims==" %%i in (
'WMIC Process WHERE "Name='cmd.exe' AND CommandLine LIKE '%%!uid!%%'" GET ParentProcessID /value'
) do for /f %%j in ("%%i") do (endlocal &set "PID=%%j")
REM finde alle cmd.exe Prozesse (außer diesem und dessen Tochterprozesse), hole die CommandLine Eigenschaft
for /f "tokens=1* delims==" %%i in (
'WMIC Process WHERE "Name='cmd.exe' AND NOT ProcessID=%PID% AND NOT ParentProcessID=%PID%" GET CommandLine /value 2^>nul'
) do for /f "delims=" %%k in ("%%j") do (
set "CmdLn="
set "BatPath="
set "CmdLn=%%k"
REM Extrahiere den Batch Pfad
setlocal EnableDelayedExpansion
set "CmdLn=!CmdLn:cmd /c "=!"
for %%l in (!CmdLn!) do (
if "!!"=="" endlocal
if not defined BatPath if /i "%%~xl"==".bat" set "BatPath=%%~l"
)
setlocal EnableDelayedExpansion
echo !BatPath!
endlocal
)
pause
Grüße
rubberman
Hallo Alme123,
ich weiß nicht wie die Ausgabe aussehen soll, aber vielleicht so:
Grüße
rubberman
EDIT: Zeile 22 eingefügt
ich weiß nicht wie die Ausgabe aussehen soll, aber vielleicht so:
@echo off &setlocal
REM Eigene PID finden, um später diesen und die Tochterprozesse (WMIC) auszufiltern
setlocal EnableDelayedExpansion
set "uid="
for /l %%i in (1 1 128) do (set /a "bit=!random!&1" &set "uid=!uid!!bit!")
for /f "tokens=2 delims==" %%i in (
'WMIC Process WHERE "Name='cmd.exe' AND CommandLine LIKE '%%!uid!%%'" GET ParentProcessID /value'
) do for /f %%j in ("%%i") do (endlocal &set "PID=%%j")
REM finde alle cmd.exe Prozesse (außer diesem und dessen Tochterprozesse), hole die CommandLine und ProcessID Eigenschaften
set "ProcessID="
for /f "delims=" %%i in (
'WMIC Process WHERE "Name='cmd.exe' AND NOT ProcessID=%PID% AND NOT ParentProcessID=%PID%" GET CommandLine^,ProcessID /value 2^>nul'
) do for /f "delims=" %%j in ("%%i") do (
set "%%j"
if defined ProcessID (
setlocal EnableDelayedExpansion
echo !ProcessID! !BatPath!
endlocal
set "ProcessID="
set "BatPath="
) else (
REM Extrahiere den Batch Pfad
setlocal EnableDelayedExpansion
set "CommandLine=!CommandLine:cmd /c "=!"
for %%l in (!CommandLine!) do (
if "!!"=="" endlocal
if not defined BatPath if /i "%%~xl"==".bat" set "BatPath=%%~l"
)
)
)
pause
Grüße
rubberman
EDIT: Zeile 22 eingefügt
Hallo Alme123,
der ganze Spaß wird ja bereits in einer Schleife ausgeführt. Ein
Grüße
rubberman
der ganze Spaß wird ja bereits in einer Schleife ausgeführt. Ein
GOTO Label
aus der Schleife heraus wird unweigerlich zum Abbruch der Schleife führen. Ein CALL :Label
hingegen wird hier wohl die bessere Variante sein.@echo off &setlocal
REM Eigene PID finden, um später diesen und die Tochterprozesse (WMIC) auszufiltern
setlocal EnableDelayedExpansion
set "uid="
for /l %%i in (1 1 128) do (set /a "bit=!random!&1" &set "uid=!uid!!bit!")
for /f "tokens=2 delims==" %%i in (
'WMIC Process WHERE "Name='cmd.exe' AND CommandLine LIKE '%%!uid!%%'" GET ParentProcessID /value'
) do for /f %%j in ("%%i") do (endlocal &set "PID=%%j")
REM finde alle cmd.exe Prozesse (außer diesem und dessen Tochterprozesse), hole die CommandLine und ProcessID Eigenschaften
set "ProcessID="
set "BatPath="
for /f "delims=" %%i in (
'WMIC Process WHERE "Name='cmd.exe' AND NOT ProcessID=%PID% AND NOT ParentProcessID=%PID%" GET CommandLine^,ProcessID /value 2^>nul'
) do for /f "delims=" %%j in ("%%i") do (
set "%%j"
if defined ProcessID (
setlocal EnableDelayedExpansion
echo !ProcessID! !BatPath!
findstr /ic:"!BatPath!" "prozess.txt" >nul && call :action
endlocal
set "ProcessID="
set "BatPath="
) else (
REM Extrahiere den Batch Pfad
setlocal EnableDelayedExpansion
set "CommandLine=!CommandLine:cmd /c "=!"
for %%l in (!CommandLine!) do (
if "!!"=="" endlocal
if not defined BatPath if /i "%%~xl"==".bat" set "BatPath=%%~l"
)
)
)
pause
goto :eof
:action
setlocal DisableDelayedExpansion
echo ****** Mach was mit %ProcessID% und "%BatPath%"! ******
endlocal
goto :eof
rubberman