Avatar billede jannek_ek Nybegynder
08. september 2007 - 15:04 Der er 28 kommentarer og
1 løsning

Batch: luk alle programmer, på nær:

Jeg kender kommandoen "taskkill", men den er ikke særlig effektiv, når jeg ikke kender programmerne. Derfor vil jeg gerne vide om det er muligt at lave et batch job, der lukker alle programmer, på nær dem der står på en liste jeg har lavet, enten ud fra navn eller ud fra PID.

Formålet med dette, er at gøre det lettere for mig at lukke alt unødvendigt. Dette er nødvendigt hvis jeg skal have min computer til at trække de nyeste spil.
Avatar billede thesurfer Nybegynder
08. september 2007 - 18:08 #1
Det er meget farligt, det du har gang i der!

Det virker også fuldstænding ulogisk:

"når jeg ikke kender programmerne"
"lukker alle programmer, på nær dem der står på en liste"

Så skal du jo netop kende ALLE programmerne!

Ellers kommer du til at lukke en masse vigtige systemprocess, programmer og ligende.
Avatar billede thesurfer Nybegynder
08. september 2007 - 18:18 #2
Jeg har lavet scriptet, men du er advaret! Scriptet bruges på eget ansvar!

Scriptet gemmes som en ".vbs" fil, f.eks. "luk.vbs".

' --- SCRIPT START ---
Option Explicit ' Alle variabler SKAL dimmes! (dvs: dim variabelnavn)

' ----
' LUKNING AF SYSTEMPROCESSER KAN GØRE COMPUTEREN USTABIL!
' BRUGES PÅ EGET ANSVAR!
' ---

dim proc_list, maa_ikke_lukkes_ned
' Format er: NAVN efterfulgt af KOLON
'
' Eksempel: maa_ikke_lukkes_ned = "svchost.exe:explorer.exe:"
'

' ------ Indsæt navnene her ------
maa_ikke_lukkes_ned = ""


' Hent alle de kørende processer:
proc_list = GetList

' Fjern dem der ikke må lukkes:
proc_list = ParseList(LCase(proc_list), LCase(maa_ikke_lukkes_ned))

' Luk resten af processerne der er tilbage i listen:
KillProcess(proc_list)



' ------ Systemet:



' Free Sample VBScript to discover which processes are running
' Author Guy Thomas http://computerperformance.co.uk/
' Version 1.4 - December 2005
' -------------------------------------------------------'
function GetList()

Dim objWMIService, objProcess, colProcess
Dim strComputer, strList

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")

Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process")

For Each objProcess in colProcess
strList = strList & objProcess.Name & ":"
Next

'WSCript.Echo strList
' End of List Process Example VBScript
GetList = strList
end function



function ParseList(proc_list, maa_ikke_lukkes_ned)
maa_ikke_lukkes_ned = split(maa_ikke_lukkes_ned, ":")

dim i
for i = LBound(maa_ikke_lukkes_ned) to Ubound(maa_ikke_lukkes_ned)
    proc_list = replace(proc_list, maa_ikke_lukkes_ned(i) & ":", "")
next

ParseList = proc_list
end function



function KillProcess(processnames)
dim objShell
Set objShell = CreateObject("WScript.Shell")

dim names, params
names = split(processnames, ":")

dim i
for i = Lbound(names) to UBound(names)
    if _
        names(i) <> "" _
        and _
        LCase(names(i)) <> "wscript.exe" _
        and _
        LCase(names(i)) <> "wscript" _
        then

        params = " /IM " & names(i) & params
    end if
next

' Luk alle processerne i listen:
msgbox "Scriptet ville have lukket:" & vbCrLf & params

' ADVARSEL: Fjern kommentaren ('-tegnet) fra næste linie, for at aktivere scriptet!
'objShell.Run "TASKKILL /F" & params
set objShell = nothing
end function
' --- SCRIPT SLUT ---
Avatar billede thesurfer Nybegynder
08. september 2007 - 18:36 #3
Læg mærke til denne disse linier i scriptet:

' Luk alle processerne i listen:
msgbox "Scriptet ville have lukket:" & vbCrLf & params

' ADVARSEL: Fjern kommentaren ('-tegnet) fra næste linie, for at aktivere scriptet!
'objShell.Run "TASKKILL /F" & params
Avatar billede jannek_ek Nybegynder
09. september 2007 - 14:15 #4
Jeg ved godt at det er lidt farligt, men i forvejen går jeg manuelt ind og lukker alle programmer, på nær dem jeg ved systemet skal bruge.

Men uanset hvor farligt det er, så kan programmet ikke komme længere end til popupboksen, hvor den siger hvad programmet vil lukke...
Avatar billede thesurfer Nybegynder
09. september 2007 - 14:46 #5
Læs lige 08/09-2007 18:36:28 igen :-)

Kort:
Fjern '-tegnet i denne linie:

'objShell.Run "TASKKILL /F" & params
Avatar billede jannek_ek Nybegynder
09. september 2007 - 16:02 #6
den havde jeg husket, men der sker alligevel ikke noget...
Avatar billede thesurfer Nybegynder
09. september 2007 - 16:11 #7
Hmm... Jeg har en mistanke om, at strenge params bliver for lang, til at prompten kan klare det..

Man kunne sætte den til at lukke x antal programmer ad gangen..

Men her er koden, der skulle åbene 1 prompt per proces, hvilket betyder at den lukker 1 proces ned ad gangen..:

function KillProcess(processnames)
dim objShell
Set objShell = CreateObject("WScript.Shell")

dim names, params
names = split(processnames, ":")

dim i
for i = Lbound(names) to UBound(names)
    if _
        names(i) <> "" _
        and _
        LCase(names(i)) <> "wscript.exe" _
        and _
        LCase(names(i)) <> "wscript" _
        then

        objShell.Run "TASKKILL /F /IM " & names(i)

    end if
next

set objShell = nothing
end function


Hvis denne funktion, som erstatter tidligere funktion med samme navn, virker, er det fordi params-strengen bliver for lang..

Så siger du bare til, og så laver jeg en begræsning på x antal filer den må lukke ad gangen..
Avatar billede jannek_ek Nybegynder
09. september 2007 - 16:44 #8
hmm nej det virker stadig ikke, men jeg prøvede at smide

msgbox "Scriptet ville have lukket:" & vbCrLf & names(i)

ind i lykken, og der lader det til at names(i) indeholder en streng med alle de programmer der skal lukkes (på een gang), i stedet for et enkelt ad gangen
Avatar billede thesurfer Nybegynder
09. september 2007 - 16:46 #9
Hvordan ser din kode ud nu? Bare så vi ikke taler forbi hinanden..
Avatar billede jannek_ek Nybegynder
09. september 2007 - 17:03 #10
Option Explicit ' Alle variabler SKAL dimmes! (dvs: dim variabelnavn)

' ----
' LUKNING AF SYSTEMPROCESSER KAN GØRE COMPUTEREN USTABIL!
' BRUGES PÅ EGET ANSVAR!
' ---

dim proc_list, maa_ikke_lukkes_ned
' Format er: NAVN efterfulgt af KOLON
'
' Eksempel: maa_ikke_lukkes_ned = "svchost.exe:explorer.exe:"
'

' ------ Indsæt navnene her ------
maa_ikke_lukkes_ned = "SMAgent.exe:svchost.exe:SMax4.exe:usnsvc.exe:SMax4PNP.exe:services.exe:alg.exe:googletalk.exe:ctfmon.exe:nvsvc32.exe:MDM.EXE:jusched.exe:lsass.exe:winlogon.exe:csrss.exe:smss.exe:cvpnd.exe:firefox.exe:System:"


' Hent alle de kørende processer:
proc_list = GetList

' Fjern dem der ikke må lukkes:
proc_list = ParseList(LCase(proc_list), LCase(maa_ikke_lukkes_ned))

' Luk resten af processerne der er tilbage i listen:
KillProcess(proc_list)



' ------ Systemet:



' Free Sample VBScript to discover which processes are running
' Author Guy Thomas http://computerperformance.co.uk/
' Version 1.4 - December 2005
' -------------------------------------------------------'
function GetList()

Dim objWMIService, objProcess, colProcess
Dim strComputer, strList

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")

Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process")

For Each objProcess in colProcess
strList = strList & objProcess.Name & ":"
Next

'WSCript.Echo strList
' End of List Process Example VBScript
GetList = strList
end function



function ParseList(proc_list, maa_ikke_lukkes_ned)
maa_ikke_lukkes_ned = split(maa_ikke_lukkes_ned, ":")

dim i
for i = LBound(maa_ikke_lukkes_ned) to Ubound(maa_ikke_lukkes_ned)
    proc_list = replace(proc_list, maa_ikke_lukkes_ned(i) & ":", "")
next

ParseList = proc_list
end function



'function KillProcess(processnames)
'dim objShell
'Set objShell = CreateObject("WScript.Shell")
'
'dim names, params
'names = split(processnames, ":")
'
'dim i
'for i = Lbound(names) to UBound(names)
'    if _
'        names(i) <> "" _
'        and _
'        LCase(names(i)) <> "wscript.exe" _
'        and _
'        LCase(names(i)) <> "wscript" _
'        then
'
'        params = " /IM " & names(i) & params
'    end if
'next
'
'' Luk alle processerne i listen:
'msgbox "Scriptet ville have lukket:" & vbCrLf & params
'
'' ADVARSEL: Fjern kommentaren ('-tegnet) fra næste linie, for at aktivere scriptet!
'objShell.Run "TASKKILL /F" & params
'set objShell = nothing
'end function


function KillProcess(processnames)
dim objShell
Set objShell = CreateObject("WScript.Shell")

dim names, params
names = split(processnames, ":")

dim i
for i = Lbound(names) to UBound(names)
    if _
        names(i) <> "" _
        and _
        LCase(names(i)) <> "wscript.exe" _
        and _
        LCase(names(i)) <> "wscript" _
        then

        msgbox "Scriptet ville have lukket:" & vbCrLf & names(i)

        objShell.Run "TASKKILL /F /IM " & names(i)

    end if
next

set objShell = nothing
end function
Avatar billede thesurfer Nybegynder
09. september 2007 - 17:27 #11
Hmm... af en eller anden mystisk årsag, tilføjede den "wscript.exe" til navnet på filen den ville lukke..

Prøv med:

function KillProcess(processnames)
dim objShell
Set objShell = CreateObject("WScript.Shell")

dim names, params
names = split(processnames, ":")

dim i
for i = Lbound(names) to UBound(names)
    if _
        names(i) <> "" _
        and _
        LCase(names(i)) <> "wscript.exe" _
        and _
        LCase(names(i)) <> "wscript" _
        then

        names(i) = replace(names(i), "wscript.exe", "") ' fjern "wscript.exe"

        msgbox "Scriptet ville have lukket:" & vbCrLf & names(i)

        objShell.Run "TASKKILL /F /IM " & names(i)

    end if
next

msgbox "done"

set objShell = nothing
end function
Avatar billede thesurfer Nybegynder
09. september 2007 - 17:28 #12
Jeg har lige testet den nye kode (09/09-2007 17:27:45) i en virtuel maskine, og der virkede det fint.
Avatar billede thesurfer Nybegynder
09. september 2007 - 17:47 #13
Hmmm.... Det virker kun, hvis det kun er 1 program den skal lukke..
Jeg må lige lave nogle flere tests.. der er et eller andet galt her..
Avatar billede jannek_ek Nybegynder
09. september 2007 - 17:49 #14
nej det virker stadig ikke ... men burde den ikke lave en msgbox for hvert enkelt program, der skal lukkes?

jeg har en fornemmelse af at der hvor den glipper er at names(i) udskriver alle de processer, der skal lukkes på en gang, uden mellemrum. I stedet for at køre taskkill på hver enkelt program.

taskkill /F /IM explorer.exe virker fint, men taskkill /F /IM explorer.exeduc20.exe virker ikke.
Avatar billede thesurfer Nybegynder
09. september 2007 - 18:04 #15
Det her skulle gerne virke:

function KillProcess(processnames)
dim objShell
Set objShell = CreateObject("WScript.Shell")

dim names, params
names = split(processnames, ":")

dim i
for i = Lbound(names) to UBound(names)
    if _
        names(i) <> "" _
        and _
        LCase(names(i)) <> "wscript.exe" _
        and _
        LCase(names(i)) <> "wscript" _
        then

        names(i) = replace(names(i), "wscript.exe", "")
        params = " /IM " & names(i) & params
    end if
next
'WScript.sleep 100

objShell.Run "TASKKILL /F" & params
set objShell = nothing

msgbox "done"
end function
Avatar billede thesurfer Nybegynder
09. september 2007 - 18:04 #16
Sammen med:

function ParseList(proc_list, maa_ikke_lukkes_ned)
maa_ikke_lukkes_ned = split(maa_ikke_lukkes_ned, ":")

dim i
for i = LBound(maa_ikke_lukkes_ned) to Ubound(maa_ikke_lukkes_ned)
    if maa_ikke_lukkes_ned(i) <> "" then
        proc_list = replace(proc_list, maa_ikke_lukkes_ned(i) & ":", "")
    end if
next

ParseList = proc_list
end function


Det var her fejlen lå.. :-)
Avatar billede thesurfer Nybegynder
09. september 2007 - 18:07 #17
Hvis 09/09-2007 18:04:27 ikke virker, kan du bruge den funktion, der lukker 1 program ned ad gangen:

function KillProcess(processnames)
dim objShell
Set objShell = CreateObject("WScript.Shell")

dim names, params
names = split(processnames, ":")

dim i
for i = Lbound(names) to UBound(names)
    if _
        names(i) <> "" _
        and _
        LCase(names(i)) <> "wscript.exe" _
        and _
        LCase(names(i)) <> "wscript" _
        then

        names(i) = replace(names(i), "wscript.exe", "") ' fjern "wscript.exe"
        objShell.Run "TASKKILL /F /IM " & names(i)

    end if
next

msgbox "done"

set objShell = nothing
end function


Men du skal lige være opmærksom på, at "luk 1 program ned ad gangen" = mange popups af sorte vinduer..

:-)
Avatar billede thesurfer Nybegynder
09. september 2007 - 18:13 #18
Jeg kan fortælle dig, at hvis maa_ikke_lukkes_ned(i) indeholdte et tom navn, ville den fjerne (tom + ":") hvilket jo bare er ":".. :-)

Når den så bare fjerne ":", vil der f.eks. stå "notepad.exewrite.exe", i stedet for "notepad.exe:write.exe"..

Det var det der var problemet.. jeg løste det simpelthen ved at spørge om maa_ikke_lukkes_ned(i) var lig ""..
Avatar billede jannek_ek Nybegynder
09. september 2007 - 18:37 #19
18:04:59 og 18:07:20 var lige det der skulle bruges!
mange tak for hjælpen :P
Avatar billede plx Nybegynder
09. september 2007 - 18:42 #20
taskkill /f /fi "imagename ne svchost.exe" /fi "imagename ne notepad.exe"

skulle gøre det samme som vbscriptet.
Avatar billede thesurfer Nybegynder
09. september 2007 - 18:54 #21
plx> Hmm.. måske er det bare mig.. men hvad er pointen med 09/09-2007 18:42:57..? :-)

jannek_ek> Takker for points.. beklager at der var så mange fejl.. Alt hvad der kan gå galt, går sommetider galt.. :-)
Avatar billede thesurfer Nybegynder
09. september 2007 - 18:57 #22
ne: not equal

Resultatet er det samme: Lukning af process hvis navn ikke er med på en liste :-)
Avatar billede plx Nybegynder
09. september 2007 - 18:58 #23
Jeg kan godt lide at forenkle ting. Så hvis hele det script kan koges ned i en enkelt kommando, så er det vel værd at nævne
Avatar billede thesurfer Nybegynder
09. september 2007 - 18:59 #24
Hmm..

Scriptet kan jo netop ikke "koges ned i en enkelt kommando"..

Du bliver nødt til at inkludere alle de navne den ikke må lukke.

Hvordan havde du tænkt dig at gøre det?
Avatar billede plx Nybegynder
09. september 2007 - 19:01 #25
/fi "imagename ne svchost.exe" /fi "imagename ne notepad.exe"

lukker hverken svchost eller notepad. Man kan sætte flere filtre på...
Avatar billede thesurfer Nybegynder
09. september 2007 - 19:03 #26
Hvad så med alle de andre processer, som heller ikke må lukkes ned..?

Kig i din Task Manager.. hvis du tror at "svchost.exe" og "notepad.exe" er det eneste der ikke må lukkes ned, så....... .-)
Avatar billede plx Nybegynder
09. september 2007 - 19:03 #27
så sætter du bare dem på også...
Avatar billede thesurfer Nybegynder
09. september 2007 - 19:06 #28
Det bliver en lang "enkelt kommando".. :-)

Og det er ikke engang sikkert at prompten kan klare så lange strenge, hvilket er grunden til det med "luk 1 proces ned ad gangen"..
Avatar billede plx Nybegynder
09. september 2007 - 19:12 #29
Den bliver måske lang, men den er forståelig, også for dem der ikke kan programmere. Og hvis den ikke er for lang, så vil den nok virke :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester