10440
Goto Top

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:

'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})"  

Content-Key: 18656

Url: https://administrator.de/contentid/18656

Printed on: April 24, 2024 at 18:04 o'clock

Member: fritzo
fritzo Oct 28, 2005 at 16:16:24 (UTC)
Goto Top
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
Member: Biber
Biber Oct 28, 2005 at 16:41:03 (UTC)
Goto Top
*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:
[...] "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. face-wink

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
Mitglied: 10440
10440 Oct 28, 2005 at 16:47:32 (UTC)
Goto Top
Erstmal danke für deine Hilfe,

aber da die Defragmentierung auf Windows 2000 Server laufen soll, fällt diese Lösung schon einmal weg.
Da aus unerklärlichen Gründen MS die "defrag.exe" nicht mitgeliefert hat.
Leider kann auch keine andere Software eingesetzt werden, so dass nur noch die Möglichkeit mit "dfrg.msc" bleibt.

Gruß Mandos
Member: ketchup
ketchup Oct 28, 2005 at 19:58:15 (UTC)
Goto Top
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

wie schon geantwortet => du befindest dich am falschen Betriebssystem ... bitte genau lesen face-wink
Member: ketchup
ketchup Oct 28, 2005 at 20:02:57 (UTC)
Goto Top
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
Member: fritzo
fritzo Oct 29, 2005 at 00:14:02 (UTC)
Goto Top
@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
Member: fritzo
fritzo Oct 29, 2005 at 00:21:42 (UTC)
Goto Top
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
Member: fritzo
fritzo Oct 29, 2005 at 00:36:54 (UTC)
Goto Top
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
Member: Biber
Biber Oct 29, 2005 at 00:46:47 (UTC)
Goto Top
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
Member: fritzo
fritzo Oct 29, 2005 at 01:00:22 (UTC)
Goto Top
Du kannst contig bedenkenlos benutzen, sämtliche Defragtools gehen imho über die Windows-API und nutzen alle die gleichen Funktionen.

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..

DAS wäre wahrscheinlich "eher nicht so gut" face-smile 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
Member: ketchup
ketchup Oct 29, 2005 at 07:40:15 (UTC)
Goto Top
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 face-wink
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
Member: fritzo
fritzo Oct 30, 2005 at 14:10:05 (UTC)
Goto Top
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?

@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. ;)
Member: fritzo
fritzo Oct 30, 2005 at 14:12:12 (UTC)
Goto Top
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.

ACK, Batch ist hier besser geeignet.
Member: Biber
Biber Oct 30, 2005 at 14:32:01 (UTC)
Goto Top
face-wink
@fritzo & ketchup

also diese variante finde ich nicht sinnvoll.
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
Member: maneich
maneich Aug 13, 2007 at 11:21:01 (UTC)
Goto Top
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
Member: dimugi
dimugi Aug 16, 2009 at 11:07:54 (UTC)
Goto Top
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