Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Auf Prozessende warten und dann herunterfahren



  • Please log in to reply
40 replies to this topic
nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

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


Visit the new forum ahkscript.org.

http://ahkscript.org


CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

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.



Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011
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

 


CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

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



CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

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.



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

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


CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

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



CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

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



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011
✓  Best Answer

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.


CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

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



CodeNewbee
  • Members
  • 104 posts
  • Last active: Dec 02 2015 10:12 PM
  • Joined: 25 Jul 2013

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