Wenn der CCleaner installiert ist hinterlässt er auch einen Pfad in der Registry.

Auf Prozessende warten und dann herunterfahren

Best Answer just me , 16 August 2013 - 11:33 AM
Ja, da gebe ich Dir Recht und Seidenweber war ja auch so nett da schon einmal etwas zu entwickeln.
;// Existiert eine installierte Version von CCleaner? // Anderenfalls im MUI-Chache suchen RegRead, CCPfad, HKEY_LOCAL_MACHINE, SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\ccleaner.exe, Path ; Versuchen, den Pfad direkt auszulesen If ErrorLevel ; wenn nicht erfolgreich... Loop, HKEY_CURRENT_USER, software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache ; ...dann alle Einträge im MUI-Cache durchsuchen { RegRead, Key, HKEY_CURRENT_USER, %A_LoopRegSubkey%, %A_LoopRegName% ; Einzelnen REG_SZ lesen If (Key = "CCleaner") ; Wenn CCLeaner... SplitPath, A_LoopRegName,, CCPfad ; ...dann den Pfad aus dem Eintrag isolieren } Until CCPfad ; Schleifenende, wenn CCPfad nicht mehr leer ist MsgBox % CCPfad
Allerdings müßte das dann ja miteinander verknüpft werden. Statt eine Meldung auszuben müsste sich der Pfad dann in eine Textdatei eintragen und dann vom Script wieder eingelesen werden. Dies ist allerdings viel zu hoch für mich.
Da aber bisher schon mal zahlreiche Anwendungsfälle abgedeckt sind...
Aber falls Jemand Lust hat sich hier mit einzubringen... Letztlich vermute ich mal das dieses Projekt vielen Usern helfen kann, da der CCleaner ja doch sehr beliebt ist.

Dies ist allerdings viel zu hoch für mich.
Quark. Der wesentliche Punkt ist, dass du dich dafür interessierst und sich die Leute, die hier helfen, nicht umsonst nen Kopf machen.
Was du bisher alleine gebastelt hast, ist schon längst mehr als ausreichend für den Zweck und für dich selbst reichte schon, was HotKeyIt ganz am Anfang geschrieben hat. Aber wenn man das aus der Hand geben will, ist es natürlich ziemlich cool, wenn man möglichst viele Sonderfälle berücksichtigt.

All questions & answers are related to AHK 1.1.19.03 x64 Unicode
For Item In ComObjGet("winmgmts:").ExecQuery("Select * from CIM_DataFile where (FileName = 'CCleaner' or FileName = 'CCleaner64') and Extension = 'exe'") MsgBox,4160,, % "Dateiname`t" Item.FileName "." Item.Extension "`n" . "Version`t`t" Item.Version "`n" . "Hersteller`t`t" Item.Manufacturer "`n" . "Pfad\Datei`t" Item.Name "`n" . "Größe`t`t" Item.FileSize "`n" . "Type`t`t" Item.FileType "`n" . "Pfad`t`t" Item.Drive Item.Path
Die Systemlast ist hier aber zu hoch und es dauert auch zu lange, wie Du ja selbst schon mit angemerkt hast, das ist also nicht empfehlenswert...
Was genau macht eigentlich: ComObjGet("winmgmts:").ExecQuery

Na gut:
Dann sollte erst einmal ein Konzept erstellt werden:
1.) Die Ermittlung des OS, z.B. so: http://www.autohotke...-based-on-that/ - müsste aber verbessert werden
2.) Suche CCleaner an den "üblichen" Pfaden (bereits mit unserer Version möglich)
3.) Wenn der CCleaner nicht gefunden wird, durchsuche die Registry, und gebe den Pfad in einer ini oder Textdatei aus. - Teilweise möglich mit:
;// Existiert eine installierte Version von CCleaner? // Anderenfalls im MUI-Chache suchen RegRead, CCPfad, HKEY_LOCAL_MACHINE, SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\ccleaner.exe, Path ; Versuchen, den Pfad direkt auszulesen If ErrorLevel ; wenn nicht erfolgreich... Loop, HKEY_CURRENT_USER, software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache ; ...dann alle Einträge im MUI-Cache durchsuchen { RegRead, Key, HKEY_CURRENT_USER, %A_LoopRegSubkey%, %A_LoopRegName% ; Einzelnen REG_SZ lesen If (Key = "CCleaner") ; Wenn CCLeaner... SplitPath, A_LoopRegName,, CCPfad ; ...dann den Pfad aus dem Eintrag isolieren } Until CCPfad ; Schleifenende, wenn CCPfad nicht mehr leer ist MsgBox % CCPfad
4.) Die in der ini oder Textdatei gespeicherte CCleaner Version ausführen.
5.) Optional das System herunterfahren oder Neustarten
Und wenn man schon dabei ist, könnte man auch gleich noch die Möglichkeit des automatischen Updates für den CCleaner, genau wie es mit dem Jes-Updaters möglich ist, nachbauen. Und vielleicht noch eine Updatefunktion für den CCEnhancer mit einbauen.
Dann hätte man praktisch ein Schweizer Taschenmesser für den CCleaner.
Die Business und Co. Versionen des CCleaners unterstützen ja automatische Updates, der kostenlose CCleaner natürlich nicht.

... man könnte auch das komplette Dateisystem nach einer passenden Exe durchsuchen, aber (meiner Meinung nach): Keep it simple!
Ich würde nur in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths suchen. Hier sollte sich ein Eintrag finden, wenn der CCleaner ordentlich installiert ist.
Wenn da nichts gefunden wird, würde ich den User per FileSelectFile
genau einmal nach dem Pfad zur Exe fragen.
Das Ergebnis wird bei der ersten Ausführung des Skripts in einer INI gespeichert. Solange der in der INI abgelegte Pfad gültig ist, wird CCleaner von dort gestartet, ansonsten beginnt es wieder oben.

Prefer ahkscript.org for the time being.
Danke just me,
das Suchen funktioniert ja schon über:
;// Existiert eine installierte Version von CCleaner? // Anderenfalls im MUI-Chache suchen RegRead, CCPfad, HKEY_LOCAL_MACHINE, SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\ccleaner.exe, Path ; Versuchen, den Pfad direkt auszulesen If ErrorLevel ; wenn nicht erfolgreich... Loop, HKEY_CURRENT_USER, software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache ; ...dann alle Einträge im MUI-Cache durchsuchen { RegRead, Key, HKEY_CURRENT_USER, %A_LoopRegSubkey%, %A_LoopRegName% ; Einzelnen REG_SZ lesen If (Key = "CCleaner") ; Wenn CCLeaner... SplitPath, A_LoopRegName,, CCPfad ; ...dann den Pfad aus dem Eintrag isolieren } Until CCPfad ; Schleifenende, wenn CCPfad nicht mehr leer ist
Hier könnte man ja vorher noch das Betriebssystem abfragen, indem man lediglich nachschaut ob der Ordner: C:\Program Files (x86) existiert, den es ja nur auf 64 bit Systemen geben kann. (Ab Windows Vista glaube ich) Dies sollte im Umkehrschluss dann dazu führen das anschließend nur noch die CCleaner64.exe gesucht wird.
Wie kommt dann aber das Ergebnis der CCleaner Suche in eine ini Datei, ich meine per IniWrite ist klar, aber das muss ja dann auch wieder per IniRead vernünftig auslesbar sein.
Im Übrigen eine sehr gute Idee mit der User Abfrage per: FileSelectFile... Denn dann könnte ja auch direkt eine portable Version abgefragt werden!!!

Erkennung des OS / 32 oder 64 bit System:
IfExist, %SystemDrive%\Program Files (x86) ; If this folder exists system is 64bit GoTo 64bit ; Directs script past reporting 32bit system information IfNotExist, %SystemDrive%\Program Files (x86) ; If this folder does not exist system is 32bit or other GoTo 32bit ; Not necessary but keeps continuity 32bit: Gui, Add, Text, x27 y60 w360 h30 +Center, 32-bit System Detected SetEnv 32or64, 32bit ; Sends this to variable for x86 registry entries GoTo WindowRemaining 64bit: Gui, Add, Text, x27 y60 w360 h30 +Center, 64-bit System Detected SetEnv 32or64, 64bit ; Sends this to variable for x64 registry entries GoTo WindowRemaining ; Not necessary but keeps continuity WindowRemaining: ; rest of the GUI is built here but a MsgBox will do for now MsgBox, System is %32or64%, var is %32or64%
ODER:
; http://www.autohotkey.com/board/topic/66187-detect-if-system-is-32-or-64-bit-and-send-var-based-on-that/ VarSetCapacity(si,44) DllCall("GetNativeSystemInfo", "uint", &si) if ErrorLevel { MsgBox Windows XP or later required. ExitApp } arc := NumGet(si,0,"ushort") MsgBox % arc=0 ? "32-bit System Detected" : arc=9 ? "64-bit System Detected" : arc=6 ? "IA64" : "Unknown System" If (arc = 0) { 32or64 := "32bit" } If (arc = 9) { 32or64 := "64bit" } If (arc = 6) { 32or64 := "Unknown System" } MsgBox, System is %32or64%`nVAR has been set to "%32or64%"`n(The rest of the GUI is built here)
32 bit CCleaner Suche:
;// Existiert eine installierte Version von CCleaner? Nur fuer 32 bit// Anderenfalls im MUI-Chache suchen RegRead, CCPfad, HKEY_LOCAL_MACHINE, SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\ccleaner.exe, Path ; Versuchen, den Pfad direkt auszulesen If ErrorLevel ; wenn nicht erfolgreich... Loop, HKEY_CURRENT_USER, software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache ; ...dann alle Einträge im MUI-Cache durchsuchen { RegRead, Key, HKEY_CURRENT_USER, %A_LoopRegSubkey%, %A_LoopRegName% ; Einzelnen REG_SZ lesen If (Key = "CCleaner") ; Wenn CCLeaner... SplitPath, A_LoopRegName,, CCPfad ; ...dann den Pfad aus dem Eintrag isolieren } Until CCPfad ; Schleifenende, wenn CCPfad nicht mehr leer ist MsgBox %CCPfad%\ccleaner.exe
64 bit CCleaner Suche:
;// Existiert eine installierte Version von CCleaner? Nur fuer 64 bit // Anderenfalls im MUI-Chache suchen RegRead, CCPfad, HKEY_LOCAL_MACHINE, SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\ccleaner64.exe, Path ; Versuchen, den Pfad direkt auszulesen If ErrorLevel ; wenn nicht erfolgreich... Loop, HKEY_CURRENT_USER, software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache ; ...dann alle Einträge im MUI-Cache durchsuchen { RegRead, Key, HKEY_CURRENT_USER, %A_LoopRegSubkey%, %A_LoopRegName% ; Einzelnen REG_SZ lesen If (Key = "CCleaner") ; Wenn CCLeaner... SplitPath, A_LoopRegName,, CCPfad ; ...dann den Pfad aus dem Eintrag isolieren } Until CCPfad ; Schleifenende, wenn CCPfad nicht mehr leer ist MsgBox %CCPfad%\ccleaner64.exe
Das müsste jetzt "nur noch" miteinander verknüpft werden. Sprich, wenn 32 bit die 32 bit Suche und wenn 64 bit die 64 bit Suche...

Hallo,
ob ein 64-Bit OS installiert ist, verrät Dir die vordefinierte Variable A_Is64bitOS
. Sie enthält 1 (True) bei einem 64-Bit OS, sonst 0 (False).
Wenn CCleaner installiert ist, gibt es mit Sicherheit einen Eintrag unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
, mangels CCleaner weiß ich aber nicht, ob der Key nun immer CCleaner.exe oder bei 64-Bit Installationen stattdessen CCleaner64.exe heißt. Er enthält jedenfalls den kompletten Pfad der Exe.
Der grundsätzliche Ablauf sieht für mich so aus:
#NoEnv #Persistent INI_Datei := "Pfad_der_INI_Datei" ; ist gut in A_AppData untergebracht CCPath := "" ; Step 1: INI Datei ---------------------------------------------------------------------------------------------------- If FileExist(INI_Datei) { ; wenn die INI-Datei vorhanden ist IniRead, Path, %INI_Datei%, CCleaner, Path ; ... lies den Pfad If (Path <> "ERROR" And FileExist(Path)) ; ... wenn ein Wert gelesen wurde und die Datei existiert CCPath := Path ; ... ... setze die Variable CCPath } ; Step 2: Registrierung ------------------------------------------------------------------------------------------------ If (CCPath = "") { ; wenn der Pfad nicht über die INI-Datei ermittelt wurde If (A_Is64bitOS) ; ... wenn ein 64-Bit OS installiert ist CCKey := "ccleaner64.exe" ; ... ... setze den Key für 64-Bit (falls nötig) Else ; ... sonst CCKey := "ccleaner.exe" ; ... ... setze den Key für 32-Bit (falls nötig) RegRead, Path, HKEY_LOCAL_MACHINE, SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\%CCKey%, Path If (!ErrorLevel And FileExist(Path)) ; ... wenn ein Wert gelesen wurde und die Datei existiert CCPath := Path ; ... ... setze die Variable CCPath } ; Setp 3: Benutzerabfrage ---------------------------------------------------------------------------------------------- If (CCPath = "") { ; wenn der Pfad nicht maschinell ermittelt werden konnte FileSelectFile, Path, 1, , Bitte die zu startende CCleaner Exe-Datei auswählen:, CCleaner (*.exe) If (!ErrorLevel) ; ... wenn eine Datei ausgewählt wurde CCPath := Path ; ... ... setze die Variable CCPath } ; Step 4: Haben wir jetzt den Pfad? ------------------------------------------------------------------------------------ If (CCpath = "") { ; nein, wir verlassen das Skript MsgBox, 16, Fehler!, Die CCleaner.exe konnte nicht gefunden werden! ExitApp } ; Step 5: INI-Datei schreiben ------------------------------------------------------------------------------------------ IniWrite, %CCPath%, %INI_Datei%, CCleaner, Path ; Hier könnte man noch auf Fehler prüfen ; Step 6: Dein Part ---------------------------------------------------------------------------------------------------- ; ... ; ... ; ...

Prefer ahkscript.org for the time being.
Wow, das sieht wirklich schon sehr sehr gut aus. Vielen Dank für Deine Mühe.
Auch durch die Struktur und die detaillierten Kommentare macht es das Ganze wirklich sehr übersichtlich.
Diese Schreibweise werde ich mir für zukünftige Projekte auch zulegen, da dies die Fehlersuche und die Arbeit erheblich erleichtert.
Aber ich denke mal das es genau so funktionieren wird, ich bin begeistert. Der Rest ist ja schon fast fertig, ich denke das bekomme ich alleine hin.
Das Ergebnis veröffentliche ich hier gerne wieder. Wird aber wohl eine Weile dauern...

Momentan muss ich das Ganze aus beruflichen Gründen leider auf Eis legen.
Ob und wann ich hier weitermachen kann, ist leider offen.
Falls aber Jemand das Projekt fortsetzen möchte, ist er oder sie hiermit herzlich eingeladen...
