10440
28.10.2005, aktualisiert am 13.08.2007
32791
16
0
Starten und beenden eines Programms mittels VB-Script
Hallo Zusammen,
Ich hoffe ihr könnt mir helfen obwohl ich nicht ganz sicher bin ob das hier der richtige Bereich ist.
Es geht um ein im Internet gefundenes VB-Script, welches automatisch unter Windows 2000 die Defragmentierung der einzelnen Partitionen startet und nach der Fertigstellung beendet.
Der automatische Start klappt auch ohne Probleme, allerdings hapert es noch am automatischen beenden.
Vielen Dank schon mal für die Hilfe.
MFG Mandos
Und hier das Script:
Ich hoffe ihr könnt mir helfen obwohl ich nicht ganz sicher bin ob das hier der richtige Bereich ist.
Es geht um ein im Internet gefundenes VB-Script, welches automatisch unter Windows 2000 die Defragmentierung der einzelnen Partitionen startet und nach der Fertigstellung beendet.
Der automatische Start klappt auch ohne Probleme, allerdings hapert es noch am automatischen beenden.
Vielen Dank schon mal für die Hilfe.
MFG Mandos
Und hier das Script:
'Shell-Objekt initialisieren
Set WshShell = CreateObject("WScript.Shell")
'Defrag-Management-Console mit gewünschtem Laufwerk starten
WshShell.Run "dfrg.msc c:"
'Warteschleife, bis das Fenster "Defragmentierung" erscheint
While WshShell.AppActivate("Defragmentierung") = FALSE
Wscript.Sleep 1000
Wend
'Defragmentierungs-Fenster zur Sicherheit nochmal aktivieren
WshShell.AppActivate "Defragmentierung"
Wscript.Sleep 200
'Tastenfolge zum Start der Defragmentierung senden
WshShell.SendKeys ("%OD")
WshShell.SendKeys ("{TAB}")
WshShell.SendKeys ("~")
'Warten, bis Defragmentierung beendet ist
While WshShell.AppActivate("Defragmentierung abgeschlossen") = FALSE
Wscript.Sleep 5000
Wend
'Meldungsbox zur Sicherheit nochmal aktivieren
WshShell.AppActivate "Defragmentierung abgeschlossen"
'WScript.Sleep 200
'Tastenkombination ALT+F4 zum Schliessen der Meldungsbox senden
WshShell.SendKeys ("{TAB}")
WshShell.SendKeys ("~")
WScript.Sleep 200
'Tastenkombination ALT+F4 zum Beenden von Defrag senden
WshShell.Sendkeys "(%{F4})"
WshShell.Sendkeys "(%{F4})"
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 18656
Url: https://administrator.de/contentid/18656
Ausgedruckt am: 26.11.2024 um 09:11 Uhr
16 Kommentare
Neuester Kommentar
*lacht* @fritzo
Genau das gibts doch nicht bei Win2000...
Da ist doch dieser Rohrkrepierer von abgespeckter Diskeeper-Version dabei (keine Möglichkeit, das Zeugs einfach in Batch oder als Task einzubinden).
Siehe bei M$ KB 130539:
Natürlich gäbe es -rein technisch- die Möglichkeit, das Defrag-Utility von einem Win-XP-System zu kopieren... das würde auch anstandslos unter W2k laufen, aber es wäre bestimmt rechtlich fragwürdig. So einen Tipp würde ich nie posten.
Soweit ich weiß, gibt/gab es für die englische W2k-Version eine Lösung namens Rundfrg.exe, die mal als JSI-Tipp 2062 gepostet wurde. Ist wegen zu vieler Beschwerden und Fehler dort gestrichen worden. Und unter JSI 8414 und ein bisschen Hangelei kommt man/frau auch noch auf ein Sourceforge-Projekt namens AutoDefrag, in dem das Ganze mit CPP gelöst wird. Aber ein wenig aufwändig ist das schon.
Da lass uns lieber dieses Skriptchen zum Fliegen bringen.
Grüße
Biber
Genau das gibts doch nicht bei Win2000...
Da ist doch dieser Rohrkrepierer von abgespeckter Diskeeper-Version dabei (keine Möglichkeit, das Zeugs einfach in Batch oder als Task einzubinden).
Siehe bei M$ KB 130539:
[...] "Microsoft Windows Server 2003, Microsoft Windows XP, and Microsoft Windows 2000 include a tool for disk defragmentation. The Windows Disk Defragmenter tool is a limited version of the Diskeeper program from Diskeeper Corporation. Disk Defragmenter does not include all the features available in the full version of Diskeeper." [...]
Natürlich gäbe es -rein technisch- die Möglichkeit, das Defrag-Utility von einem Win-XP-System zu kopieren... das würde auch anstandslos unter W2k laufen, aber es wäre bestimmt rechtlich fragwürdig. So einen Tipp würde ich nie posten.
Soweit ich weiß, gibt/gab es für die englische W2k-Version eine Lösung namens Rundfrg.exe, die mal als JSI-Tipp 2062 gepostet wurde. Ist wegen zu vieler Beschwerden und Fehler dort gestrichen worden. Und unter JSI 8414 und ein bisschen Hangelei kommt man/frau auch noch auf ein Sourceforge-Projekt namens AutoDefrag, in dem das Ganze mit CPP gelöst wird. Aber ein wenig aufwändig ist das schon.
Da lass uns lieber dieses Skriptchen zum Fliegen bringen.
Grüße
Biber
Hi,
spar Dir den Aufwand mit der MMC und nimm
das konsolenbasierte Binary defrag.exe.
Inklusive Logfile wäre der Aufruf wie
folgt:
WshShell.Run "defrag.exe c: >
logfile.txt"
Und wenn das fertig ist, ist es fertig und
muß nicht beendet oder abgeschossen
werden.
Grüße,
fritzo
spar Dir den Aufwand mit der MMC und nimm
das konsolenbasierte Binary defrag.exe.
Inklusive Logfile wäre der Aufruf wie
folgt:
WshShell.Run "defrag.exe c: >
logfile.txt"
Und wenn das fertig ist, ist es fertig und
muß nicht beendet oder abgeschossen
werden.
Grüße,
fritzo
wie schon geantwortet => du befindest dich am falschen Betriebssystem ... bitte genau lesen
hallo,
das mit dem rechtlichen ist so ein problem ... dazu kommt noch der verlust von supportleistungen wenn notwendig.
ich kenn die beiden tools.
und habe sie auch bei mir eingesetzt ... testweise.
habs auch adaptiert und an meine bedürfnisse angepasst.
das autodefrag wollte bei mir allerdings nicht wirklich ... naja ich arbeite auch auf englischen systemen und da hats wohl gehappert.
hast du an dem skript was verändert? oder 1:1 übernommen und eingesetzt?
wenn du einen kostenlosen defrager brauchst, dann kannst von O&O die freeware einsetzen ... die lizenz solltest dir trotzdem durchlesen. weil ich weiß net, obs net nur fürn privaten einsatz frei ist.
jürgen
das mit dem rechtlichen ist so ein problem ... dazu kommt noch der verlust von supportleistungen wenn notwendig.
ich kenn die beiden tools.
und habe sie auch bei mir eingesetzt ... testweise.
habs auch adaptiert und an meine bedürfnisse angepasst.
das autodefrag wollte bei mir allerdings nicht wirklich ... naja ich arbeite auch auf englischen systemen und da hats wohl gehappert.
hast du an dem skript was verändert? oder 1:1 übernommen und eingesetzt?
wenn du einen kostenlosen defrager brauchst, dann kannst von O&O die freeware einsetzen ... die lizenz solltest dir trotzdem durchlesen. weil ich weiß net, obs net nur fürn privaten einsatz frei ist.
jürgen
@ketchup
danke für den Klug###er-Tip ;) war aber redundant, da bereits von Biber gepostet.
@Biber + mandos
Hab leider kein W2K hier und bin davon ausgegangen, daß es mit dabei ist - schon merkwürdig, daß es nicht so ist. Taskkill hat er dann auch nicht. Wie wäre es mit dem Freeware-Tool PSKill von Sysinternals? Gibts auf http://www.sysinternals.com/Utilities/PsKill.html
Aber ich schau noch mal nach einer Scriptlösung; sollte es eigentlich geben.
Grüße,
fritzo
danke für den Klug###er-Tip ;) war aber redundant, da bereits von Biber gepostet.
@Biber + mandos
Hab leider kein W2K hier und bin davon ausgegangen, daß es mit dabei ist - schon merkwürdig, daß es nicht so ist. Taskkill hat er dann auch nicht. Wie wäre es mit dem Freeware-Tool PSKill von Sysinternals? Gibts auf http://www.sysinternals.com/Utilities/PsKill.html
Aber ich schau noch mal nach einer Scriptlösung; sollte es eigentlich geben.
Grüße,
fritzo
Hi,
hier gibts auch einen freien Defragger:
http://www.sysinternals.com/Utilities/Contig.html
Du könntest ihn mittels eines Batchfiles benutzen:
@echo off
if exist %temp%\123tmp.tmp del %temp%\123tmp.tmp
dir /b /L /s >> %temp%\123tmp.tmp
for /f %%a in (%temp%\123tmp.tmp) do contig -s "%%a"
@echo ...fertig!
Oder einfach rekursiv:
contig -s c:\*.*
Grüße,
fritzo
hier gibts auch einen freien Defragger:
http://www.sysinternals.com/Utilities/Contig.html
Du könntest ihn mittels eines Batchfiles benutzen:
@echo off
if exist %temp%\123tmp.tmp del %temp%\123tmp.tmp
dir /b /L /s >> %temp%\123tmp.tmp
for /f %%a in (%temp%\123tmp.tmp) do contig -s "%%a"
@echo ...fertig!
Oder einfach rekursiv:
contig -s c:\*.*
Grüße,
fritzo
Ok,
hier ist das versprochene VBScript zum Beenden eines Prozesses. Du mußt mmc.exe beenden (es werden alle Prozesse dieses Namens beendet)
snip---------------
Option Explicit
Dim objWMIService, objProcess, colProcess
Dim strComputer, strProcessKill
strComputer = "."
'strProcessKill = "'dfrg.msc'" geht nicht --> mmc.exe
strProcessKill = "'mmc.exe'"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill )
For Each objProcess in colProcess
objProcess.Terminate()
Next
snip--------------
Grüße,
fritzo
hier ist das versprochene VBScript zum Beenden eines Prozesses. Du mußt mmc.exe beenden (es werden alle Prozesse dieses Namens beendet)
snip---------------
Option Explicit
Dim objWMIService, objProcess, colProcess
Dim strComputer, strProcessKill
strComputer = "."
'strProcessKill = "'dfrg.msc'" geht nicht --> mmc.exe
strProcessKill = "'mmc.exe'"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill )
For Each objProcess in colProcess
objProcess.Terminate()
Next
snip--------------
Grüße,
fritzo
Super, fritzo!
Den contig-Defragger kannte ich auch noch nicht. Danke!
Mit dem Gedanken, den Defrag-Krams am Ende einfach mit Taskkill oder ähnlichem abzusch(l)ießen, habe ich auch gespielt.. aber ich dachte, vielleicht postet einer der VBS-Gurus noch die vorgesehene Möglichkeit.
Falls dieses VBSkript überhaupt zuverlässig ist - was passiert denn da, wenn der/die dfrg.msc mit einer dieser albernen Rückfragen kommt, die ich bei M$ so liebe? "Sektor 16274 ist nicht lesbar - wollen Sie ein Protokoll speichern?" oder so etwas..
Egal, Deine Sysinternals-Variante probier ich mal aus.
[Edit]...am 29.10. nach dem Frühstück...
Das Contig-Utilitily habe ich nun ausprobiert - allerbest, wie alles von SysInternals.
Würde spätestens jetzt keine Minute Aufwand in irgendeine VBS-Ruf-mir-ein-GUI-Proggi-und-drück-mir-die-Tasten-Lösung stecken.
Ist nicht gegen VB-Skripter gerichtet - aber ein Defrag- oder Aufräumkrams ist für mich eine Batch-Anforderung mit Silent im Hintergrund und Log-Möglichkeiten.
Und keine für bunte Kästchen auf dem Monitor.
[/Edit]
Grüße
Biber
Den contig-Defragger kannte ich auch noch nicht. Danke!
Mit dem Gedanken, den Defrag-Krams am Ende einfach mit Taskkill oder ähnlichem abzusch(l)ießen, habe ich auch gespielt.. aber ich dachte, vielleicht postet einer der VBS-Gurus noch die vorgesehene Möglichkeit.
Falls dieses VBSkript überhaupt zuverlässig ist - was passiert denn da, wenn der/die dfrg.msc mit einer dieser albernen Rückfragen kommt, die ich bei M$ so liebe? "Sektor 16274 ist nicht lesbar - wollen Sie ein Protokoll speichern?" oder so etwas..
Egal, Deine Sysinternals-Variante probier ich mal aus.
[Edit]...am 29.10. nach dem Frühstück...
Das Contig-Utilitily habe ich nun ausprobiert - allerbest, wie alles von SysInternals.
Würde spätestens jetzt keine Minute Aufwand in irgendeine VBS-Ruf-mir-ein-GUI-Proggi-und-drück-mir-die-Tasten-Lösung stecken.
Ist nicht gegen VB-Skripter gerichtet - aber ein Defrag- oder Aufräumkrams ist für mich eine Batch-Anforderung mit Silent im Hintergrund und Log-Möglichkeiten.
Und keine für bunte Kästchen auf dem Monitor.
[/Edit]
Grüße
Biber
Du kannst contig bedenkenlos benutzen, sämtliche Defragtools gehen imho über die Windows-API und nutzen alle die gleichen Funktionen.
DAS wäre wahrscheinlich "eher nicht so gut" Deswegen auch mein Vorschlag, ein Dosbox-Tool zu benutzen. Bei den GUI-Tools hat man so überhaupt keine Infos, Rückgabewerte oder Logs.
Was anderes - seid ihr ganz sicher, daß es nur die MMC-Variante unter W2K gibt? Weil ich ein paar Artikel gefunden habe, die auf folgende Files unter W2K hinweisen:
-Dfrgfat.exe
-Dfrgntfs.exe
Ich hab hier momentan leider kein W2K zum Nachsehen, aber Ihr könntet ja mal checken, ob diese Files existieren und ggfs. in Zusammenhang mit einem Script benutzbar sind (kann natürlich auch sein, daß das nur die Binaries für das GUI-Defrag sind..)
[EDIT: vergesst das mit den zwei Files, es sind wirklich nur die für das GUI-Defrag]
Grüße,
fritzo
was passiert denn da, wenn der dfrg.msc mit einer diesen albernen
Rückfragen kommt, die ich bei M$ so liebe? "Sektor 16274 ist nicht lesbar -
wollen Sie ein Protokoll speichern?" oder so etwas..
Rückfragen kommt, die ich bei M$ so liebe? "Sektor 16274 ist nicht lesbar -
wollen Sie ein Protokoll speichern?" oder so etwas..
DAS wäre wahrscheinlich "eher nicht so gut" Deswegen auch mein Vorschlag, ein Dosbox-Tool zu benutzen. Bei den GUI-Tools hat man so überhaupt keine Infos, Rückgabewerte oder Logs.
Was anderes - seid ihr ganz sicher, daß es nur die MMC-Variante unter W2K gibt? Weil ich ein paar Artikel gefunden habe, die auf folgende Files unter W2K hinweisen:
-Dfrgfat.exe
-Dfrgntfs.exe
Ich hab hier momentan leider kein W2K zum Nachsehen, aber Ihr könntet ja mal checken, ob diese Files existieren und ggfs. in Zusammenhang mit einem Script benutzbar sind (kann natürlich auch sein, daß das nur die Binaries für das GUI-Defrag sind..)
[EDIT: vergesst das mit den zwei Files, es sind wirklich nur die für das GUI-Defrag]
Grüße,
fritzo
hi,
also diese variante finde ich nicht sinnvoll.
warum sollte ich alle mmc.exe? was ist wenn ich nebenbei noch andere mmcs laufen habe? die sollen in diesem falle alle gekillt werden?
wäre wohl nicht so gut
außerdem was passiert bei mehreren platten und partitionen?
da gefällt mir die contig-variante schon besser.
aber wie gesagt, ich hab das vbs für die mmc bei mir im einsatz ... etwas adaptiert, aber funktioniert.
klar sind solche "seltenen varianten" wie "sector nicht gefunden" udgl nicht damit abgedeckt.
jürgen
also diese variante finde ich nicht sinnvoll.
warum sollte ich alle mmc.exe? was ist wenn ich nebenbei noch andere mmcs laufen habe? die sollen in diesem falle alle gekillt werden?
wäre wohl nicht so gut
außerdem was passiert bei mehreren platten und partitionen?
da gefällt mir die contig-variante schon besser.
aber wie gesagt, ich hab das vbs für die mmc bei mir im einsatz ... etwas adaptiert, aber funktioniert.
klar sind solche "seltenen varianten" wie "sector nicht gefunden" udgl nicht damit abgedeckt.
jürgen
also diese variante finde ich nicht
sinnvoll.
warum sollte ich alle mmc.exe? was ist wenn
ich nebenbei noch andere mmcs laufen habe?
die sollen in diesem falle alle gekillt
werden?
sinnvoll.
warum sollte ich alle mmc.exe? was ist wenn
ich nebenbei noch andere mmcs laufen habe?
die sollen in diesem falle alle gekillt
werden?
@Jürgen
Hi Du Schlauberger,
was meinst Du wohl, warum ich in meinem Posting darauf hingewiesen habe, daß dies so ist... Leider heissen die Prozesse nun mal nicht "MMC noch benötigt" und "MMC zum Abschuß freigegeben" ;) Daher kann man nun mal nur "mmc.exe" beenden. Eine andere Idee wäre, den Prozess per VBScript zu starten und sich dann die PID zu holen, um mit dieser zu arbeiten. Aber das führt hier zu weit. Aber zumindest habe -ich- ein paar konstruktive Vorschläge dazu. ;)
@fritzo & ketchup
also diese variante finde ich nicht sinnvoll.
warum sollte ich alle mmc.exe? ..
..warum sollte ich alle mmc.exe? ..
Hi Du Schlauberger,
Nun kommt mal wieder runter. Die Ausgangsfrage von Mandos war : "Ich hab da im Internet ein VBSkript gefunden.."
...und die gemeinsam entwickelte Antwort ist:
"Bring es unauffällig wieder dahin zurück - wir haben eine bessere Lösung."
Schönen Sonntag noch
Biber
Hallo,
bin über Google auf diesen Thread gestoßen.
Sysinternals gehört ja jetzt zu MS.
Nach einigem Suchen habe ich aber die Progies von Sysinternals gefunden.
Per 31.03.2007 wurde die config.exe geändert und wird nur noch zur "Filedefragmentierung" angeboten.
Frage: Kann man damit trotzdem auch Laufwerke defragmentieren oder ist nur die alte Version dazu geeignet.
Hat auch nur eine Größe von 55 KB.
MfG maneich
bin über Google auf diesen Thread gestoßen.
Sysinternals gehört ja jetzt zu MS.
Nach einigem Suchen habe ich aber die Progies von Sysinternals gefunden.
Per 31.03.2007 wurde die config.exe geändert und wird nur noch zur "Filedefragmentierung" angeboten.
Frage: Kann man damit trotzdem auch Laufwerke defragmentieren oder ist nur die alte Version dazu geeignet.
Hat auch nur eine Größe von 55 KB.
MfG maneich
Der Dialog der nach Ende der Defragmentierung aufgeht tägt den selben Namen wie das Haupfenster.
Ich habe festgestellt, daß das Script aus der while-Schleife "Defragmentierung abgeschlossen" nicht heraus kommt.
Weil wahrscheinlich die Bezeichnungen der beiden Fenster gleich ist und keines "Defragmentierung abgeschlossen" heißt.
Da beide Namen gleich sind könnte ich mir vorstellen über eine Programm-id (Task-ID) o.ä. das Erreignis abzufragen.
Leider bin ich in VBS noch nicht fit genug.
Vielleicht hat jemand dazu eine Idee. Es wäre schade wenn mann das Script nicht noch fertig machen könnte, da es bis auf das beenden ja funktioniert.
Gruß
Dimugi
Ich habe festgestellt, daß das Script aus der while-Schleife "Defragmentierung abgeschlossen" nicht heraus kommt.
Weil wahrscheinlich die Bezeichnungen der beiden Fenster gleich ist und keines "Defragmentierung abgeschlossen" heißt.
Da beide Namen gleich sind könnte ich mir vorstellen über eine Programm-id (Task-ID) o.ä. das Erreignis abzufragen.
Leider bin ich in VBS noch nicht fit genug.
Vielleicht hat jemand dazu eine Idee. Es wäre schade wenn mann das Script nicht noch fertig machen könnte, da es bis auf das beenden ja funktioniert.
Gruß
Dimugi